0-1背包
第一层循环使全部遍历。第二层循环(变量j=约束的总量;j>=a[i]a[i]为约束变量中相应的个数;j--)第三层循环如果还有约束变量的话再加。写法和上一层类似。
状态转移方程f[j]=max(f[j],f[j-a[i]]+v[i]);
当有两个约束变量时,状态转移方程中f[]变f[][]二维数组。f[][]=max(f[][],f[-相应的约束变量数值][-相应的约束变量数值]+v[i]);
完全背包
特点:个数无限
第一层循环使其全部遍历。第二层循环(变量j=a[i]a[i]为约束变量中相应的数值;j<=约束变量总数;j++)第三层循环如果还有约束变量的话再写,写法与上一层循环一样。
状态转移方程f[j]=max(f[j],f[j-a[i]]+v[i]);
过程:
当一种物品无限时算出所有的f[j],然后换另一种物品无限时算出所有的f[j],然后更新相应的最大值。直到所有的物品种类都经历完。
多重背包
特点:个数可以随意。
第一层循环使其全部遍历。第二层循环(变量j=1;j<=b[i]b[i]为该种物品所需要的总个数;j++)第三层循环(变量k=约束变量的总数;k>=a[i]相应变量中相应的个数;k--)
状态转移方程f[k]=max (f[k],f[k-a[i]]+V[i])
不同:
多了一个第二层循环来限制其相应的个数。