1. 关于动规-完全背包
前置背包:
- 01背包
- 每个物品只能用一次
- 多重背包
- 情形:每个物品限用n次,各不相等
- 01背包的变体,遍历原始数组nums,将所有物品的数量展开为1的新数组newNums,确保每一个物品在nums中有一个唯一的index i(即01背包)
注:背包思路跳转01背包总结
**
完全背包:
- 情形:每个物品重复使用无限次
- 正序遍历背包 for (int j=target; j>=weight[i]; j++)
- 情形1:求组合(每种组合只能用一次)
- 情形1.1 求所有组合的数量(return int)
- 遍历顺序:先背包后物品
- 递推公式:dp[i]+=dp[i-nums[j]]
- 例题:lc377 组合总和
- 情形1.1 求所有组合的数量(return int)
- 情形2:求排列(组合可以重复使用,如[1,2]和[2,1])
- 情形2.1 求排列的数量(return int)
- 遍历顺序:先物品后背包
- 递推公式:dp[i]+=dp[i-nums[j]]
- 例题:lc322 零钱兑换,lc279 完全平方数
- 情形2.2 尝试排列并返回这种排列是否可行 (return boolean)
- 遍历顺序:先物品后背包
- 递推公式:dp[i-b’s_Length]==true && a’s_slice.equals(b)
- 例题:lc139 单词拆分
- 情形2.1 求排列的数量(return int)