有时候,看作者写的代码容易懵逼。遇到一个问题,还是要自己先找到思路,然后自己实现出来才是上策。
#货币选择问题 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))