我们知道,超市收银员在收款时经常遇到找零的情况,在超时的收款台里面,会有各种各样面值的硬币,在向顾客找零钱时,也会有多种方案,但是一般会选择找出硬币数量最少的方案。
举个例子,假设硬币面值有如下七种
当要找0.8元时,其实有很多种方案:
当然,最佳方案应该就是5角+2角+1角,这就是贪心策略的最佳体现
因此,我们可以试着编写程序,根据输入的需要找的零钱数,求出找零钱时硬币数目最少的方案。举例如下:
接下来我们开始分析
为了让找出的硬币最少,首先要从最大面值的硬币开始计算
2.92 ➗1 = 2余数是0.92,也就是需要2个1元的硬币,余下的钱是0.92
0.92 ➗0.5 = 1余数是0.42,也就是需要1个0.5元的硬币,余下的钱是0.42
0.42 ➗0.2 = 2余数是0.02,也就是需要2个0.2元的硬币,余下的钱是0.02
0.02 ➗0.02 = 1余数是0,也就是需要1个0.02元的硬币,没有余数
这样,正好完成了找零钱的过程
我们根据上面的分析和实验的结果,我们总结下任务设计的思路
首先,将零钱面值存储到列表
其次,输入要找的零钱数
最后,从面值最大的零钱开始遍历并计算零钱个数
我们代码实现如下:
def test_change():
# 将零钱面值存储到列表
d = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1]
while True:
try:
# 输入要找的零钱数,输入的是一个浮点数
sum = float(input("请输入需要找的零钱:"))
if sum <= 0:
print("您输入的不是一个正数")
else:
break
except:
print("输入错误,请重新输入")
# 获取最大索引
i = len(d) - 1
while i >= 0:
# 如果剩余金额大于等于当前的零钱面值,才进行找零计算
if sum >= d[i]:
n = int(sum / d[i])
sum = float("{:.2f}".format(sum - n * d[i]))
print("找了{}个{}元硬币".format(n, d[i]))
i -= 1