我是靠谱客的博主 威武唇膏,这篇文章主要介绍多重背包模板题 背包问题V2,现在分享给大家,希望可以做个参考。

题目:https://cn.vjudge.net/contest/180638#problem/B

有N种物品,每种物品的数量为C1,C2......Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2......Wn(Wi为整数),与之相对应的价值为P1,P2......Pn(Pi为整数)。求背包能够容纳的最大价值。


思路:利用二分法优化多重背包,将多重背包转化成01背包。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include<stdio.h> #include<algorithm> #include<string.h> using namespace std; #define maxn 50000+5 int dp[maxn],v[105],cost[105],c1[105]; int main() { int n, w,i,j,num; while (~scanf("%d%d",&n,&w)) { memset(dp, 0, sizeof(dp)); num = 0; for (i = 1; i <= n; i++) scanf("%d%d%d", &cost[i], &v[i], &c1[i]); for (i = 1; i <= n; i++) { for (int k = 1; k <= c1[i]; k <<= 1) { for (j = w; j >= k*cost[i]; j--) dp[j] = max(dp[j], dp[j - k*cost[i]] + k*v[i]); c1[i] -= k; } int k = c1[i]; if (k == 0) continue; for (j = w; j >= k*cost[i]; j--) dp[j] = max(dp[j], dp[j - k*cost[i]] + k*v[i]); } cout << dp[w] << endl; } return 0; }




最后

以上就是威武唇膏最近收集整理的关于多重背包模板题 背包问题V2的全部内容,更多相关多重背包模板题内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(70)

评论列表共有 0 条评论

立即
投稿
返回
顶部