- 01背包:n种物品,每种物品只有1个
- 完全背包:n种物品,每种物品无限个
- 多重背包:n种物品,每种物品个数各不相同
01背包
dp数组
- 二维数组dp[i][j]:[0-i]之间的物品任取放进容量为j的背包里最大价值
- 一维数组dp[j] : 容量为j的背包所背的最大价值
递推公式
-
不放物品i:dp[i-1][j]
-
放的物品i:dp[i-1][j-weight[i]]+val[i]
-
dp[i][j] = max(,)
-
一维滚动数组,相当于把上一层copy下来了
-
dp[j] = max(dp[j],dp[j-weight[i]]+val[i])
初始化
遍历顺序
(一维)01背包
- 组合数先遍历物品,在遍历背包(倒叙,保证物品添加一次)
(二维)
- 正序倒序都行
完全背包
-
顺序:背包正序
-
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
-
如果求排列数就是外层for遍历背包,内层for循环遍历物品。