对《算法之美-Python语言实现》8.5节 货币选择问题的实现记录

有时候,看作者写的代码容易懵逼。遇到一个问题,还是要自己先找到思路,然后自己实现出来才是上策。

#货币选择问题
def find_money(amount,moneys):
    """
    选择最少的货币表示,amount表示支付的金额,moneys为手上现有的纸币数量
    返回值为一个列表,[[面额,选择此面额纸币的数量]]
    """
    result=[]
    if amount<=0:#如果支付了0元
        return result
    Moneys=sorted(moneys,key=lambda one:one[0],reverse=True)#按照面额从大到小排列钱
    print("排序后的moneys序列:",Moneys)
    n=0 #从moneys开始遍历
    while(True):
        if Moneys[n][0]>amount:
            n+=1 #当面额大于要支付的金额,查看下一个
            continue
        if Moneys[n][0]<=amount:
            #找到了合适的最大金额 n索引
            j=0 #j用于记录当前选择面额的数量
            while(Moneys[n][1]>0 and amount>=Moneys[n][0]): #面值足够,且剩余待付金额>=面值时
                amount=amount-Moneys[n][0] #减去一次面值
                j+=1 #当前面值统计数量加1
                Moneys[n][1]-=1 #当前钱包此面值数量-1
            result.append([Moneys[n][0],j]) #跳出循环后,追加此次循环结果到result
            if amount==0: #如果当前待支付为0,说明付清
                break
            n+=1 #索引移动到下一个面值
        #如果当前待支付值为0,证明已经追加完毕
    return result


moneys=[[10,5],[5,2],[50,8],[20,3],[100,4],[2,11],[1,7]] #[面值,数量]

print(find_money(552,moneys))

  

上一篇:MySQL list查询


下一篇:leetcode-322-零钱兑换