【codevs3269】混合背包 背包DP裸题
来源:互联网 发布:周立功单片机培训 编辑:程序博客网 时间:2024/06/07 19:12
题目描述 Description
背包体积为V ,给出N个物品,每个物品占用体积为Vi,价值为Wi,每个物品要么至多取1件,要么至多取mi件(mi > 1) , 要么数量无限,在所装物品总体积不超过V的前提下所装物品的价值的和的最大值是多少?
输入描述 Input Description
第一行两个数N,V,下面N行每行三个数Vi,Wi,Mi表示每个物品的体积,价值与数量,Mi=1表示至多取一件,Mi>1表示至多取Mi件,Mi=-1表示数量无限
输出描述 Output Description
1个数Ans表示所装物品价值的最大值
样例输入 Sample Input
2 103 7 22 4 -1
样例输出 Sample Output
22
数据范围及提示 Data Size & Hint
对于100%的数据,V <= 200000 , N <= 200
01背包:倒着for。
完全背包:正着for。
多重背包:拆开做01背包,或者条件满足直接完全背包。
代码:
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int size=400010;struct pack{ int c,v,num;}l[size];int dp[size];int n;void print(){ for(int i=1;i<=n;i++) cout<<dp[i]<<" ";puts(""); }void zeroonepack(int cost,int value,int v){ for(int i=v;i>=cost;i--) { dp[i]=max(dp[i],dp[i-cost]+value); }}void compack(int cost,int value,int v){ for(int i=cost;i<=v;i++) { dp[i]=max(dp[i],dp[i-cost]+value); }}void multpack(int cost,int value,int &num,int v){ if(cost*num>=v) { compack(cost,value,v); return ; } int k=1; while(k<num) { zeroonepack(k*cost,k*value,v); num-=k; k<<=1; } zeroonepack(num*cost,num*value,v);}int main(){ int v; scanf("%d%d",&n,&v); for(int i=1;i<=n;i++) { scanf("%d%d%d",&l[i].c,&l[i].v,&l[i].num); } for(int i=1;i<=n;i++) { if(l[i].num==1) { zeroonepack(l[i].c,l[i].v,v); } else if(l[i].num==-1) { compack(l[i].c,l[i].v,v); } else { multpack(l[i].c,l[i].v,l[i].num,v); } } printf("%d",dp[v]); return 0;}/*2 103 7 22 4 233*/
0 0
- 【codevs3269】混合背包 背包DP裸题
- Codevs3269 混合背包 经典背包dp
- Codevs3269 混合背包
- [codevs3269] 混合背包
- codevs3269 混合背包
- codevs3269混合背包
- Codevs3269 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 最短路径练习-POJ 1860 Currency Exchange
- Floyd传递闭包-POJ-3660-Cow Contest
- Core Location
- 网络原理,以及虚拟机相关配置
- POJ 1230 Pass-Muraille 贪心
- 【codevs3269】混合背包 背包DP裸题
- MAC安装MYSQL
- 比赛排名(猎豹笔试编程题)
- [Python]模拟键盘同时按下几个按键
- 面试小结一:关于操作系统的面试题整理
- iOS地图 MapKit框架
- vi/vim 常用命令
- 《UNIX网络编程》读书笔记2---2-5章,套接字断开2,3事
- POJ 1458 dp 最大公共子序列