codevs 3269 混合背包
来源:互联网 发布:access数据库和excel 编辑:程序博客网 时间:2024/06/11 15:14
题目描述 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 10
3 7 2
2 4 -1样例输出 Sample Output
22
数据范围及提示 Data Size & Hint
对于100%的数据,V <= 200000 , N <= 200
对于多重背包,考虑:如果mi*vi >= V 那么按照完全背包来做;否则,二进制拆分,再按照01背包来做。
#include <iostream>#include <cstdio>#include <algorithm>using namespace std;struct GOODS{ int v, w, m;}G[210];int n, V, dp[200010];void zero_one_pack(int w, int v){ for(int j = V; j >= v; j--) dp[j] = max(dp[j], dp[j - v] + w);}void complete_pack(int w, int v){ for(int j = v; j <= V; j++) dp[j] = max(dp[j], dp[j - v] + w);}void multi_pack(int w, int v, int m){ if(m * v >= V) complete_pack(w, v); else { int k = 1; while(k <= m) { zero_one_pack(k * w, k * v); m -= k; k <<= 1; } zero_one_pack(m * w, m * v); }}int main(){ scanf("%d%d", &n, &V); for(int i = 1; i <= n; i++) scanf("%d%d%d", &G[i].v, &G[i].w, &G[i].m); for(int i = 1; i <= n; i++) { if(G[i].m == 1) zero_one_pack(G[i].w, G[i].v); else if(G[i].m == -1) complete_pack(G[i].w, G[i].v); else multi_pack(G[i].w, G[i].v, G[i].m); } printf("%d", dp[V]); return 0;}
0 0
- CODEVS 3269 混合背包
- 【codevs 3269】混合背包
- codevs 3269 混合背包
- 3269 混合背包(codevs)
- Codevs 3269 混合背包
- 【codevs】3269 混合背包
- codevs 3269 混合背包
- 3269混合背包——codevs
- Codevs 3269 混合背包(二进制优化)
- codevs 3269 混合背包(模板)
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 混合背包
- 八数码问题 BFS+hash
- Laravel如何与App交互(针对get与post)
- Ubuntu apt-get 出现Error 404:Not found Package Repository Errors
- 7、(知识篇)IO流(4)
- BOOL,int,float,指针变量 与“零值”比较的if语句
- codevs 3269 混合背包
- Redis的安装
- Linux系统监控-内存读取
- 创建XML接口
- 小波变换学习(1)
- C++随机数
- 自动豆子机的Java实现
- 2011
- 基础练习 十六进制转十进制