分类

dp[i][j]表示从下标0..i的物品中任意选择,当容量为j时得的价值为多少
公式一般为:
dp[i][j] = max {dp[i - 1][j], /*不选当前元素*/dp[i][j - value] + value /*选择当前元素*/}
- 确定dp数组以及下标的含义
- 确定递推公式
- dp数组初始化
- 确定遍历顺序
-
遍历顺序
01背包
二维dp数组,物品和背包的遍历顺序不影响
一维dp数组,只能先遍历物品再遍历背包,而且第二层循环从大往小遍历完全背包
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
例子
能否装满背包 dp[i] = max(dp[i], dp[i - num] + num)
- 装满背包有几种方法 dp[i] = dp[i] + dp[i - num]
- 背包装满的最大值 dp[i] = max(dp[i], dp[i - value] + value)
- 装满背包所有物品的最小个数 dp[i] = min(dp[i - num] + 1, dp[i])
