322.零钱兑换

本文介绍了一种使用动态规划解决货币找零问题的Python实现,通过定义dp数组表示不同金额所需的最小硬币数,递推公式确定状态转移,初始化为极大值并遍历硬币,最终返回找到的最小硬币数量。如果无法凑够金额,则返回-1。

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

思路;

1.确定dp数组的含义:dp[i]表示能凑齐价值为amount的最小硬币数目。

2.确定递推公式:金额一定时看给出的硬币面额coins[i],若给出的硬币面额一定时,则最少会有amount-coins[i]个硬币,放到数组中有dp[amount-coins[i]]个,对上面最少求值,则有:

dp[i]=min(dp[amount-coins[i]+1],dp[i])

3.确定初始化,dp数组表示最小硬币数目,对后续比较时会有影响,将dp数组初始化成最大即可

4.确定遍历范围:确定是先遍历硬币还是先遍历容器,对背包问题这题没有多大影响

5.返回求得的最小硬币数量

class Solution:
    def Moneychange(self,coins:list[int],amount:int)->int:
        dp=[float('inf')]*(amount+1)#将创价的呢数组初始化为负无穷大
        dp[0]=0#dp[0]=0
        #先遍历物品后遍历容器:
        for coin in coins:
            for i in range(coin,amount+1):
                if dp[i-coin]!=float('inf'):#判断是否是负无穷大
                    dp[i]=min(dp[i-coin]+1,dp[i])#递推公式
        if dp[amount]==float('inf'):#最后一种情况:背包容量(硬币总数目)小于硬币总的价格数,返回最小表示错误
            return -1
        return dp[amount]#返回最小的硬币数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值