解题报告:01背包的变种,每种物品可以有多件,只要稍微变动一下就可以转化为01背包,转化的方法就是假设这件物品有多件的话,就将这多件展开来,也就是把每种物品的每一件都看成是01背包里面的每一件物品。这样 就可以顺利的转化为01背包了。

1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #include<cmath> 6 using namespace std; 7 8 int w[2005],v[2005],ans[2005]; 9 10 int main() 11 { 12 int T,n,m; 13 scanf("%d",&T); 14 while(T--) 15 { 16 scanf("%d %d",&n,&m); 17 int num = 0,p,h,c; 18 for(int i = 1;i <= m;++i) 19 { 20 scanf("%d %d %d",&p,&h,&c); 21 while(c--) 22 { 23 v[++num] = p; 24 w[num] = h; 25 } 26 } 27 memset(ans,0,sizeof(ans)); 28 for(int i = 1;i <= num;++i) 29 for(int j = n;j >= v[i];--j) 30 ans[j] = max(ans[j],ans[j - v[i]] + w[i]); 31 printf("%d ",ans[n]); 32 } 33 return 0; 34 }