代码随想录 动态规划Ⅶ

70. 爬楼梯

爬楼梯背包解法:每一次爬的阶数是物品,楼层数是背包容量,排列问题故外层遍历背包容量,内层遍历物品

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. 零钱兑换

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

思路:完全背包,动态数组dp[i]定义 凑成总金额为 i 时所需的最少硬币个数,转移公式为:dp[i] =min(dp[i], dp[i - coins]), 初始dp[0]为0

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [float("inf") for _ in range(amount + 1)]
        dp[0] = 0
        for i in range(amount+1):
            for coin in coins:
                if i < coin:
                    continue

                dp[i] = min(dp[i], dp[i-coin] + 1)
        
        return dp[-1] if dp[-1] < float("inf") else -1

279. 完全平方数

给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。

完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,149 和 16 都是完全平方数,而 3 和 11 不是。

思路:完全背包,数字是物品,数字的平方是体积。n是容量

class Solution:
    def numSquares(self, n: int) -> int:
        dp = [float("inf") for _ in range(n+1)]
        
        dp[0] = 0
        for i in range(n+1):
            for num in range(1, i+1):
           
                if num * num > i:
                    break
                
                dp[i] = min(dp[i], dp[i - num*num] + 1)

        return dp[-1]

你可能感兴趣的:(动态规划,算法)