• Python贪心算法解决收银员找零问题


    场景描述

            在超市结账时,假设只有1分、5分、1角、3角、5角、1元的硬币,如果需要找零钱,给定需要找的零钱数目,使收银员找给顾客的硬币数量最少,运行程序如图:

    知识补充

            贪心算法是指在当前问题求解中,总是做出当前的最好选择,也就是局部最优解!使用贪心策略必须保证无后效性,也就是某个状态以后的过程不会影响到状态之前,同时局部最优策略可以产生全局最优解。

    贪心算法一般的解决步骤是:

            1.建立数学模型来描述问题;
            2.把求解的问题分成若干个子问题;
            3.对每一子问题求解,得到子问题的局部最优解;
            4.把子问题的局部最优解合成原来问题的一个解。

    定义函数功能

    初始化收银员拥有零钱数

            通过input得到每种零钱数量,定义收银员拥有的总零钱数,防止无法进行找零,同时确定各面值硬币的数量。

    1. """
    2. 通过输入获取总零钱
    3. """
    4. def new_coin():
    5. print("=====收银员总零钱统计=====")
    6. coin = [0.01, 0.05, 0.1, 0.5, 1.0]
    7. coin_num = []
    8. sum = 0
    9. for index, i in enumerate(coin):
    10. num = int(input('收银员{}面值硬币有几个?'.format(i)))
    11. coin_num.append(num)
    12. sum += i * num
    13. print("收银员总零钱数:{0}".format(sum))
    14. return sum, coin, coin_num

    编写找零

            从最大硬币面值开始,计算这一类面值可以找多少金额,每一类面值硬币的找零数量就是一个子问题,同时汇总以达到总硬币数最小的目标。

    1. """
    2. 计算找零
    3. """
    4. def change(sum, coin, coin_num):
    5. print('==========找零==========')
    6. s = float(input("请输入要找零金额:"))
    7. # 找零比收银员总零钱数大
    8. if s > sum:
    9. print("收银员零钱不够!")
    10. else:
    11. # 贪心算法要总硬币数最少,从最大面值开始找零
    12. i = len(coin) - 1
    13. while i >= 0:
    14. if s >= coin[i]:
    15. n = int(s / coin[i])
    16. if n > coin_num[i]:
    17. n = coin_num[i]
    18. #贪心算法 动态改变找零总值
    19. s -= n * coin[i]
    20. print("用了{0}面值的硬币{1}个".format(coin[i], n))
    21. i -= 1
    22. print("找零结束!")

    完整代码实现

    1. """
    2. 通过输入获取总零钱
    3. """
    4. def new_coin():
    5. print("=====收银员总零钱统计=====")
    6. coin = [0.01, 0.05, 0.1, 0.5, 1.0]
    7. coin_num = []
    8. sum = 0
    9. for index, i in enumerate(coin):
    10. num = int(input('收银员{}面值硬币有几个?'.format(i)))
    11. coin_num.append(num)
    12. sum += i * num
    13. print("收银员总零钱数:{0}".format(sum))
    14. return sum, coin, coin_num
    15. """ 计算找零 """
    16. def change(sum, coin, coin_num):
    17. print('==========找零==========')
    18. s = float(input("请输入要找零金额:"))
    19. # 找零比收银员总零钱数大
    20. if s > sum:
    21. print("收银员零钱不够!")
    22. else:
    23. # 贪心算法要总硬币数最少,从最大面值开始找零
    24. i = len(coin) - 1
    25. while i >= 0:
    26. if s >= coin[i]:
    27. n = int(s / coin[i])
    28. if n > coin_num[i]:
    29. n = coin_num[i]
    30. #贪心算法 动态改变找零总值
    31. s -= n * coin[i]
    32. print("用了{0}面值的硬币{1}个".format(coin[i], n))
    33. i -= 1
    34. print("找零结束!")
    35. if __name__ == '__main__':
    36. print("============收银员找零================")
    37. sum, coin, coin_num = new_coin()
    38. change(sum, coin, coin_num)

    PS: 个人原因,断更许久,今天开始慢慢接上之前的更新。

    欢迎点赞、收藏、评论区交流,转载标明出处。

  • 相关阅读:
    C语言之extern关键字实例总结(八十二)
    nginx做负载均衡服务器配置动静分离
    SpringBoot配置多环境开发
    【Mysql系列】02_连接+表
    IM聊天交友APP源码IM带音视频Uniapp即时通讯安卓苹果APP修改二开
    C# 窗口事件
    VRRP(虚拟路由器冗余协议)标准协议工作机制与优势介绍
    Map遍历 key-value 的4种方法
    基于binlog实现数据加工处理
    JavaScript 乘除法运算时,有精度误差的风险,导致运算结果出现很长的小数点,这种情况怎么解决?
  • 原文地址:https://blog.csdn.net/qq_52213943/article/details/127733687