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