分组背包的二维数组版代码:
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++) //j可以从小到大,也可以从大到小
for(int k=0;k<=s[i];k++) //k从零开始相当于给f[i][j]赋值f[i-1][j]
if(j>=v[i][k])
f[i][j]=max(f[i][j],f[i-1][j-v[i][k]]+w[i][k]);
分组背包的一维数组版代码:
因为需要用到第i-1层的数据,所以j只能从大到小遍历。
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--) //j只能从大到小
for(int k=0;k<=s[i];k++)
if(j>=v[i][k])
f[j]=max(f[j],f[j-v[i][k]]+w[i][k]);
多重背包本质上就是一个特殊的分组背包,某一个物品的个数最多为s,这个物品可以单独开一个分组,组内有s个物品,体积分别是v,2*v,3*v,......s*v, 价值分别是w,2*w,3*w,......s*w
多重背包的二维数组版代码:
for(int i=1;i<=n;i++)
for(int j=0;j<=m;j++)
for(int k=0;k<=s[i]&&k*v[i]<=j;k++)
f[i][j]=max(f[i][j],f[i-1][j-k*v[i]]+k*w[i]);
多重背包的一维数组版代码:
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--)
for(int k=0;k<=s[i]&&k*v[i]<=j;k++)
f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);