算法训练营Day45(动态规划7)

70. 爬楼梯 (进阶) 卡码网:57. 爬楼梯

提醒

这道题目 爬楼梯之前做过,这次再用完全背包的思路来分析一遍 

322. 零钱兑换  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

提醒

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品

本题先遍历物品 后遍历背包,还是先遍历背包 后遍历物品两种方法都可以

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [float('inf')] * (amount + 1)  # 创建动态规划数组,初始值为正无穷大
        dp[0] = 0  # 初始化背包容量为0时的最小硬币数量为0

        for coin in coins:  # 遍历硬币列表,相当于遍历物品
            for i in range(coin, amount + 1):  # 遍历背包容量
                if dp[i - coin] != float('inf'):  # 如果dp[i - coin]不是初始值,则进行状态转移
                    dp[i] = min(dp[i - coin] + 1, dp[i])  # 更新最小硬币数量

        if dp[amount] == float('inf'):  # 如果最终背包容量的最小硬币数量仍为正无穷大,表示无解
            return -1
        return dp[amount]  # 返回背包容量为amount时的最小硬币数量

279.完全平方数  力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

提醒

本题 和 322. 零钱兑换 基本是一样的,大家先自己尝试做一做 

class Solution:
    def numSquares(self, n: int) -> int:
        dp = [float('inf')] * (n + 1)
        dp[0] = 0

        for i in range(1, n + 1):  # 遍历背包
            for j in range(1, int(i ** 0.5) + 1):  # 遍历物品
                # 更新凑成数字 i 所需的最少完全平方数数量
                dp[i] = min(dp[i], dp[i - j * j] + 1)

        return dp[n]

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