有n件物品,背包总重量为V,其中物品被分成了k组,同一组中的物品最多只能选一件。
选出一些物品使得背包中物品总价值最大。
核心代码:
for(int k=1;k<=1000;k++){ //k组 for(int j=V;j>=0;j--){ //求出在相同重量下 考虑第k组后最大的价值 for(int i=0;i<vv[k].size();i++){ //确保只选了第k组中的至多一件物品 if(j>=w[vv[k][i]]){ dp[j]=max(dp[j],dp[j-w[vv[k][i]]]+v[vv[k][i]]); } } } } cout<<dp[V]<<endl;
这么写先枚举了当前背包的总重量j,再用i表示第k组中的第几件物品,这样可保证每组中最多选一件物品,且选这件物品是当前重量下、考虑了前k组物品中最优的解。