基础
完全背包问题
和01背包的区别是,完全背包问题的物品可以使用无数次,01背包的每个物品只能使用一次
在遍历顺序上,是从左向右的,而且遍历背包和遍历物品是可以进行颠倒的,这是还是因为在完全背包问题,物品可以使用无数次,导致遍历背包重量的时候是从左向右的,所需要的dp[j-nums[i]]一定在他的左上区域(一定会被提前计算)
刷题
- 携带研究材料
在卡码网上是超时的,但是和答案一样
- 零钱兑换II
动规五部曲:
- 确定dp数组含义 j是背包的容量,dp[j]是有多少种方式可以达到j
- 确定dp数组递推公式 dp[j] += dp[j-nums[i]]
- 确定dp数组初始化 dp[0] = 1 其他都为0,根据递推公式当j==nums,dp[i] += 1
- 确定dp数组递推顺序 先递归物品,后递归背包,不能颠倒,这里涉及到如果j=4, 1,1,2 和 1,2,1 是一种方法(组合),先遍历物品,在计算的方法中只涉及到 1,1,2 不会有1,2,1的存在
如果先递归背包,就是每一个数字都可以当第一个(排列),1,1,2 和 1,2,1就是两种
-
打印dp数组
-
组合总和IV
和上一题思路基本一致,就是dp数组递推顺序中,要先递归背包,再递归物品,就是排列的情况
- 爬楼梯
使用动态规划实现爬楼梯,之前是题目设置1步或者2步,这里步数为变量,需要用动态规划处理
动规五部曲:
- 确定dp数组定义: 楼梯数为j,有dp[j]种方式可以走完j
- 确定dp数组递推公式: dp[j] += dp[j-nums[i]]
- 确定dp数组初始化:dp[0] = 1 其他都是0
- 确定dp数组递推顺序: 先递归楼梯数,再递归步数,让每一种步数都可以做第一步
- 打印dp数组