贪心算法——找零钱问题

我们知道,超市收银员在收款时经常遇到找零的情况,在超时的收款台里面,会有各种各样面值的硬币,在向顾客找零钱时,也会有多种方案,但是一般会选择找出硬币数量最少的方案。

举个例子,假设硬币面值有如下七种
在这里插入图片描述
当要找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

相关推荐

  1. 贪心算法零钱

    2024-07-12 15:12:03       55 阅读
  2. 贪心算法问题

    2024-07-12 15:12:03       37 阅读
  3. 贪心算法_选址问题

    2024-07-12 15:12:03       28 阅读
  4. 贪心算法】之买柠檬水

    2024-07-12 15:12:03       65 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 15:12:03       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 15:12:03       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 15:12:03       62 阅读
  4. Python语言-面向对象

    2024-07-12 15:12:03       72 阅读

热门阅读

  1. Python数据分析~~美食排行榜

    2024-07-12 15:12:03       18 阅读
  2. 常用的内部排序算法

    2024-07-12 15:12:03       15 阅读
  3. 人脸检测+调整分辨率+调整帧率

    2024-07-12 15:12:03       26 阅读
  4. python-torch加载c++与内核函数

    2024-07-12 15:12:03       17 阅读
  5. 如何将canvas画布变成一张img图片

    2024-07-12 15:12:03       21 阅读
  6. 力扣第230题“二叉搜索树中第K小的元素”

    2024-07-12 15:12:03       24 阅读