代码随想录算法训练营第五十三天(完全背包篇)| LeetCode 322. 零钱兑换

322. 零钱兑换

题目链接:322. 零钱兑换 - 力扣(LeetCode)

思路

1. dp数组的含义

dp[j]: 凑足金额为j所需要的最少硬币为dp[j]个。

2. 确定递推公式

对于遍历到的硬币coin[i],它可以和金额和为j-coin[i]的硬币们凑成金额j,那么所需的最少个数就是dp[j-coin[i]]+1(加上它自己),如果这个值小于不考虑coin[i]时的值dp[j],就选择它,否则选择原来的值。

3. 初始化

凑足0元所需最少的硬币肯定是0个——不选就行了,所以dp[0] = 0。对于下标为非零的dp值应该是无穷大,这样才能被选择最小的值时被覆盖。

4. 遍历顺序

这里考虑的是装满背包的个数问题,和遍历硬币的顺序无关,可以外层遍历背包容量(即金额),内层遍历物体(即硬币),也可以交换。

5. 举例推导dp数组

以输入:coins = [1, 2, 5], amount = 5为例,

dp[0] = 0, dp[1] = 1, dp[2] = 1, dp[3] = 2, dp[4] = 2, dp[5] = 1

代码实现

class Solution(object):
    def coinChange(self, coins, amount):
        dp = [float('inf')] * (amount + 1)
        dp[0] = 0
        for coin in coins:
            for i in range(coin, amount + 1):
                dp[i] = min(dp[i - coin] + 1, dp[i])
        return dp[amount] if dp[amount] != float('inf') else -1
        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值