51nod 多重背包问题
2016-08-04 17:37
141 查看
100%
多重背包问题
一个背包,承量有限为W,有n种物体,第i种物体,价值Vi,占用重量为 Wi,且有Ci件,选择物品若干放入背包,使得总重量不超过背包的承重。总价值最大?
输入
第1行,2个整数,N和W中间用空格隔开。N为物品的种类,W为背包的容量。(1 <= N <= 100,1 <= W <= 50000)
第2 - N + 1行,每行3个整数,Wi,Pi和Ci分别是物品体积、价值和数量。(1 <= Wi, Pi <= 10000, 1 <= Ci <= 200)
输出
输出可以容纳的最大价值。
输入示例
3 6
2 2 5
3 3 8
1 4 1
输出示例
9
很久以前写的,不建议用这个方法,懒得改,直接给链接好了点我点我
按照方法二的话会超时的,所以用第三种方法比较不错,1 2 4 8 16 。。。这些个数组和起来可以构成任意数,所以把num[i]拆分成这几个数就好了,然后就是0-1背包的问题了
多重背包问题
一个背包,承量有限为W,有n种物体,第i种物体,价值Vi,占用重量为 Wi,且有Ci件,选择物品若干放入背包,使得总重量不超过背包的承重。总价值最大?
输入
第1行,2个整数,N和W中间用空格隔开。N为物品的种类,W为背包的容量。(1 <= N <= 100,1 <= W <= 50000)
第2 - N + 1行,每行3个整数,Wi,Pi和Ci分别是物品体积、价值和数量。(1 <= Wi, Pi <= 10000, 1 <= Ci <= 200)
输出
输出可以容纳的最大价值。
输入示例
3 6
2 2 5
3 3 8
1 4 1
输出示例
9
很久以前写的,不建议用这个方法,懒得改,直接给链接好了点我点我
按照方法二的话会超时的,所以用第三种方法比较不错,1 2 4 8 16 。。。这些个数组和起来可以构成任意数,所以把num[i]拆分成这几个数就好了,然后就是0-1背包的问题了
#include <cstdio> #include <cstring> #define LL long long #define M 100010 #define INF 0x3f3f3f #define RCL(a, b) memset(a, b, sizeof(a)) int max(int a, int b) { return a > b ? a : b; } LL min(LL a, LL b) { return a < b ? a : b; } LL dp[M], b[M], fee2[M], v2[M]; int main() { int n, w, v[M], fee[M], num[M]; RCL(dp, 0); scanf("%d%d", &n, &w); for(int i=1; i<=n; i++) { scanf("%d%d%d", &v[i], &fee[i], &num[i]); } int yn = 1;//记录拆分后的背包个数 for(int i=1; i<=n; i++)//麻烦的拆分 { int k = 1, an = 0; while(num[i] - k > 0) { num[i] -= k; b[an++] = k; k *= 2; } b[an++] = num[i]; for(int j=0; j<an; j++) { v2[yn] = v[i] * b[j]; fee2[yn++] = fee[i] * b[j]; } } for(int i=1; i<yn; i++) { for(int j=w; j>=v2[i]; j--) { dp[j] = max(dp[j], dp[j-v2[i]] + fee2[i]); } } printf("%lld\n", dp[w]); return 0; }
相关文章推荐
- 51nod 1007 正整数分组 (类01背包问题)
- 51Nod 1085 背包问题(01背包 )
- 51nod 1085 背包问题(01背包)
- 51nod 1085 背包问题
- 51nod 1086 背包问题 V2
- 51nod 多重背包问题 (dp)
- 51Nod-背包问题V2(多重背包+二进制优化)
- 51nod-1086 背包问题(多重背包)
- 51nod-【多重背包问题】
- 51nod 1085 背包问题【01背包】
- 51Nod 1086 背包问题 V2(二进制多重背包)
- 51Nod 有限背包计数问题 题解报告
- 51nod 1086 背包问题V2(巧妙拆分多重背包)
- 51nod 1257 背包问题 V3(二分)
- 【51Nod】1085 - 背包问题(01背包)
- 51nod 1085 背包问题
- 51Nod-1085-背包问题
- 51nod 1086 背包问题 V2 多重背包
- 51NOD 背包问题v2(动态规划)
- 51Nod 1086 背包问题 V2(多重背包)