兑换零钱所需要的最少货币张数

要求:给定数组coin,coin中所有的值都为正整数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个num,代表要找的钱数,求组成num的最少货币数。如果无解,请返回-1.

思路:
1、生成num+1长度的数组,数组的值为num+1
2、循环选取1到num的数i,若i小于coin中每一个值,则数组的值不变;若i大于coin中的值,则根据ans[i]=min(ans[i],ans[i-j]+1)更新数组值
备注:ans[i]=min(ans[i],ans[i-j]+1)表示为了换i块钱,可以通过方案:coin中一张j面值的货币+(换i-j面值的最小货币张数)实现。
3、直到循环到num位置,该位置表示换取num所需的最小张数。如果该值小于初始值num+1,则返回该值,否则返回-1.
备注:-1表示无法换刚刚好num块钱;coin里面是空值;coin里面的数太大,num太小,无法换取。
def coinchange(coins,num):
    ans = [num+1]*(num+1)
    ans[0]=0
    for i in range(1,num+1):
        for j in coins:
            if i >= j :
                ans[i]=min(ans[i],ans[i-j]+1)
    return ans[num] if ans[num]!=(num+1) else -1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值