Leetcode| 322. 零钱兑换、279. 完全平方数 Day45

文章讲述了使用动态规划方法解决凑足总额最小钱币个数(CoinChange)和找到和为给定数值的最少完全平方数数量(PerfectSquares)的问题。通过遍历物品和背包,利用递推公式更新状态数组dp,找到最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

322. Coin Change

dp[j]:凑足总额为j所需钱币的最少个数为dp[j]

凑足总额为j - coins[i]的最少个数为dp[j - coins[i]],那么只需要加上一个钱币coins[i]即dp[j - coins[i]] + 1就是dp[j](考虑coins[i])
所以dp[j] 要取所有 dp[j - coins[i]] + 1 中最小的。
递推公式:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);

本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。
所以本题并不强调集合是组合还是排列。

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [float('inf')] * (amount + 1)
        dp[0] = 0

        for i in range(len(coins)):     # 遍历物品
            for j in range(coins[i], amount + 1):       # 遍历背包
                dp[j] = min(dp[j], dp[j - coins[i]] + 1)

        if dp[amount] == float('inf'):
            return -1
        return dp[amount]

279. Perfect Squares

dp[j]:和为j的完全平方数的最少数量为dp[j]
和上题一样,本题并不强调集合是组合还是排列,随便先遍历物品还是先遍历背包。

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

        nums = [i*i for i in range(1, n + 1) if i*i <= n]

        for num in nums:        # 遍历物品
            for j in range(num, n + 1):     # 遍历背包
                dp[j] = min(dp[j], dp[j - num] + 1)

        return dp[n]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值