复制代码
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47#include <bits/stdc++.h> using namespace std; struct E { int w; //体积 int v; //重量 } lis[2001]; int dp[101]; int main() { int T,n,m; int p,h,k; int i,j; int index,c; scanf("%d%d",&n,&m); //n表示容量,m表示种类 index = 0; //拆分后物品总数 for( i=1; i<=m; i++) { c = 1; scanf("%d%d%d",&p,&h,&k); //p表示价格,h表示重量,k表示大米袋数。 while( k-c>0) { k -= c; lis[++index].w = c*p; lis[index].v = c*h; c *= 2; } lis[++index].w = p*k; //补充不足指数的差值 lis[index].v = h*k; } for( i=0; i<=n; i++) dp[i]=0; for( i=1; i<=index; i++) //对拆分后的物品进行0-1背包 { for( j=n; j>=lis[i].w; j--) dp[j] = max( dp[j],dp[j-lis[i].w]+lis[i].v); } printf("%dn",dp[n]); return 0; }
单调队列优化多重背包
最后
以上就是幸福酸奶最近收集整理的关于多重背包问题的全部内容,更多相关多重背包问题内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复