01背包问题
for(int i=0;i<n;i++){ //枚举背包物品
for(int j=m;j>=v;j--){ //枚举背包体积
f[j]=Math.max(f[j],f[j-v]+w) //更新体积最大值
}
}
完全背包问题
for(int i=0;i<n;i++){ //枚举物品
for(int j=v;j<=m;j++){ //枚举体积
f[j]=Math.max(f[j],f[j-v]+w) //更新最大值
}
}
多重背包问题
for(int i=0;i<n;i++){ //枚举物品
for(int k=1;k<=cnt;k++){ //枚举物品个数
for(int j=m;j>=k*v;j--){ //枚举物品体积
f[j]=Math.max(f[j],f[j-k*v]+k*w));
}
}
}
多重背包二进制优化
for(int i=0;i<n;i++){ //枚举物品
for(int k=1;k<=cnt;k*=2){ //利用倍增思想进行枚举个数优化
for(int j=m;j>=k*v;j--){
f[j]=Math.max(f[j],f[j-k*v]+k*w);
}
cnt-=k;
}
if(cnt>0){
for(int j=m;j>=cnt*v;j--){
f[j]=Math.max(f[j],f[j-cnt*v]+cnt*w);
}
}
}
分组背包问题
for(int i=0;i<s;i++){ //枚举组数
for(int j=m;j>=0;j--){ //枚举体积
for(int k=0;k<cnt[i];k++){ //枚举组内每个物品
if(j>=v[i][k]){
f[j]=Math.max(f[j],f[j-v[i][k])+w[i][k]);
}
}
}
}
注:当给背包开二维空间时,不在乎枚举顺序,当压缩一维空间时,01背包须从大到小枚举,如果从小到大枚举,第i层本应用第i-1层状态更新,变成了的i层空间更新,与原本不符,完全背包从小到大枚举,完全背包是用本层更新,所以需从小到大遍历