代码随想录算法训练营第三十七天|leetcode518.零钱兑换II、leetcode377. 组合总和 Ⅳ、卡玛网57. 爬楼梯
1 leetcode518.零钱兑换II
题目链接:518. 零钱兑换 II - 力扣(LeetCode)
文章链接:代码随想录
视频链接:动态规划之完全背包,装满背包有多少种方法?组合与排列有讲究!| LeetCode:518.零钱兑换II_哔哩哔哩_bilibili
思路:之前一维这是完全背包的理论问题,就写了,结果报错了,反过来看视频,主要还是那个问题,数组中的数据的输入方式是什么,怎么求
1.1 视频后的方法
卡壳的地方还是初始化的时候值为多少,遍历顺序过程中的递推公式怎么写
class Solution:
def change(self, amount: int, coins: List[int]) -> int:
dp = [0]*(amount+1)
dp[0] = 1
for i in range(len(coins)):
for j in range(coins[i],amount+1):
dp[j] += dp[j-coins[i]]
return dp[-1]
1.2 本题小结
- 这道题目,真的是自己弄混了,就准备照葫芦画瓢,其实题目相对而言不是那么难理解吧
- 还是背包问题中两大问题
dp[0]如何初始化,递推公式需要怎么写
2 leetcode377. 组合总和 Ⅳ
题目链接:377. 组合总和 Ⅳ - 力扣(LeetCode)
文章链接:代码随想录
视频链接:动态规划之完全背包,装满背包有几种方法?求排列数?| LeetCode:377.组合总和IV_哔哩哔哩_bilibili
思路:第一反应之前做过类似的题目,但是这道题出问题了,我自己做的时候,是在便利顺序上面,这道题应该先遍历物品,然后背包
2.1 视频后的方法
主要是遍历过程中前后顺序的问题,完全背包问题,如果是组合数就是先遍历物品再遍历背包,如果是排列数就是先遍历背包再遍历物品
class Solution:
def combinationSum4(self, nums: List[int], target: int) -> int:
dp = [0]*(target+1)
dp[0] = 1
for i in range(1,target+1):
for j in range(len(nums)):
if i-nums[j]>=0:
dp[i] +=dp[i-nums[j]]
return dp[target]
2.2 本题小结
- 这道题真的开始我甚至都没看清题目,就开始胡乱写,导致写错了,后来理解了以后就好一些了吧
- 这两道题目就覆盖了完全背包的组合与排列问题,其实安排的真的挺合理的
3 卡玛网57. 爬楼梯
题目链接:57. 爬楼梯(第八期模拟笔试)
文章链接:代码随想录
思路:就是一模一样的一个版本吧,反正照葫芦画瓢画出来的,这种题还是需要我多去写,感觉掌握的很一般
3.1自己的代码
其实边写,就能便理解,继续加油吧
n,m = map(int,input().split())
dp = [0]*(n+1)
dp[0] = 1
for i in range(1,n+1):
for j in range(1,m+1):
if i-j>=0:
dp[i] +=dp[i-j]
print(dp[n])
3.2 本题小结
- 这是一个排列的题目,就是任意方法都算结果,其实思路还是比较简单的吧
- 主要就是完全背包中如何遍历的一个方法吧
4 今日小结
- 今天主要是两个内容,完全背包问题的一个解题的整体思路是什么样子的
- 内容中注意完全背包问题的遍历顺序过程,里面的是先物品还是先背包,有区别的,在结果中
- 组合:先遍历背包,再遍历物品。排列:先遍历物品,再遍历背包。

浙公网安备 33010602011771号