题目:(题目来源:程序员的算法趣题)
当下,坐公交或者地铁时大部分人都是刷卡的。不过,时至今日还 在用现金支付的人还是比想象的多。本题我们以安置在公交上的零钱兑 换机为背景。 这个机器可以用纸币兑换到10 日元、50 日元、100 日元和500 日 元硬币的组合,且每种硬币的数量都足够多(因为公交接受的最小额度 为 10 日元,所以不提供 1 日元和 5 日元的硬币)。兑换时,允许机器兑换出本次支付时用不到的硬币。此外,因为在 乘坐公交时,如果兑换出了大量的零钱会比较不便,所以只允许机器最 多兑换出15 枚硬币。譬如用1000 日元纸币兑换时,就不能兑换出 “100 枚 10 日元硬币”的组合。求兑换1000日元纸币时会出现多少种组合?注意,不计硬币兑出的先后顺序思路。
上代码:(正向思维)
import numpy as np import datetime def PayCash(money): sum=0 result=[] for i in range(15): #10元 for j in range(15): #50元 for k in range(15): #100元 for l in range(15): #1000元 sum=i*10+j*50+k*100+l*500 count=i+j+k+l if(sum==money and count<=15): result.append( [i,j,k,l]) break if(len(result)==0): #吐回原来的钱 return money else: return result print("*"*50) start = datetime.datetime.now() result=PayCash(1000) end = datetime.datetime.now() spendtime=end-start print("PayCash result:=") print(result) print("Paycash result kind:=") print(len(result)) print("PayCash(1000) Spend time:{}".format(spendtime.microseconds)) print("*"*50)
结果: