Day37 - 动态规划 Part05

59 阅读2分钟

基础

完全背包问题

和01背包的区别是,完全背包问题的物品可以使用无数次,01背包的每个物品只能使用一次

在遍历顺序上,是从左向右的,而且遍历背包和遍历物品是可以进行颠倒的,这是还是因为在完全背包问题,物品可以使用无数次,导致遍历背包重量的时候是从左向右的,所需要的dp[j-nums[i]]一定在他的左上区域(一定会被提前计算)

image.png

刷题

  1. 携带研究材料

kamacoder.com/problempage…

在卡码网上是超时的,但是和答案一样

image.png

  1. 零钱兑换II

leetcode.cn/problems/co…

image.png

动规五部曲:

  1. 确定dp数组含义 j是背包的容量,dp[j]是有多少种方式可以达到j
  2. 确定dp数组递推公式 dp[j] += dp[j-nums[i]]
  3. 确定dp数组初始化 dp[0] = 1 其他都为0,根据递推公式当j==nums,dp[i] += 1
  4. 确定dp数组递推顺序 先递归物品,后递归背包,不能颠倒,这里涉及到如果j=4, 1,1,2 和 1,2,1 是一种方法(组合),先遍历物品,在计算的方法中只涉及到 1,1,2 不会有1,2,1的存在

如果先递归背包,就是每一个数字都可以当第一个(排列),1,1,2 和 1,2,1就是两种

  1. 打印dp数组

  2. 组合总和IV

leetcode.cn/problems/co…

image.png

和上一题思路基本一致,就是dp数组递推顺序中,要先递归背包,再递归物品,就是排列的情况

  1. 爬楼梯

kamacoder.com/problempage…

image.png

使用动态规划实现爬楼梯,之前是题目设置1步或者2步,这里步数为变量,需要用动态规划处理

动规五部曲:

  1. 确定dp数组定义: 楼梯数为j,有dp[j]种方式可以走完j
  2. 确定dp数组递推公式: dp[j] += dp[j-nums[i]]
  3. 确定dp数组初始化:dp[0] = 1 其他都是0
  4. 确定dp数组递推顺序: 先递归楼梯数,再递归步数,让每一种步数都可以做第一步
  5. 打印dp数组

总结