代码随想录算法训练营第45天| 70. 爬楼梯 (进阶)、322. 零钱兑换、279.完全平方数

  • 今日学习的文章链接,或者视频链接

第九章 动态规划part07

  • 自己看到题目的第一想法

70

爬楼梯,每次可以爬m阶,转换为完全背包问题:

class Solution:
    def climbStairs(self, n: int) -> int:
        dp = [0]*(n + 1)
        dp[0] = 1
        m = 2
        # 遍历背包
        for j in range(n + 1):
            # 遍历物品
            for step in range(1, m + 1):
                if j >= step:
                    dp[j] += dp[j - step]
        return dp[n]

322

零钱兑换,求最少多少硬币:

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        # 初始化
        dp = [float("inf")]*(amount + 1)
        dp[0] = 0
        
        # 遍历物品
        for coin in coins:
            # 遍历背包
            for j in range(coin, amount + 1):
                dp[j] = min(dp[j], dp[j - coin] + 1)
        return dp[amount] if dp[amount] != float("inf") else -1

279:

跟上面一道题一样,就是换个壳子:

class Solution:
    def numSquares(self, n: int) -> int:
        # 初始化
        nums = [i**2 for i in range(1, n + 1) if i**2 <= n]
        dp = [float("inf")]*(n + 1)
        dp[0] = 0
        # 遍历物品
        for num in nums:
            # 遍历背包
            for j in range(num, n + 1):
                    dp[j] = min(dp[j], dp[j - num] + 1)
        return dp[n]

  • 看完代码随想录之后的想法

  • 自己实现过程中遇到哪些困难

  • 今日收获,记录一下自己的学习时长

完全背包

你可能感兴趣的:(算法)