代码随想录算法训练营第三十七天|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 本题小结

  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 本题小结

  1. 这道题真的开始我甚至都没看清题目,就开始胡乱写,导致写错了,后来理解了以后就好一些了吧
  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 本题小结

  1. 这是一个排列的题目,就是任意方法都算结果,其实思路还是比较简单的吧
  2. 主要就是完全背包中如何遍历的一个方法吧

4 今日小结

  1. 今天主要是两个内容,完全背包问题的一个解题的整体思路是什么样子的
  2. 内容中注意完全背包问题的遍历顺序过程,里面的是先物品还是先背包,有区别的,在结果中
  3. 组合:先遍历背包,再遍历物品。排列:先遍历物品,再遍历背包。
posted @ 2024-12-04 10:22  小方呀0524  阅读(17)  评论(0)    收藏  举报