贪心算法:硬币问题(无限个)

贪心算法

  贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 [1] 。
  贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。也就是说,不从整体最优上加以考虑,做出的只是在某种意义上的局部最优解。详情参见贪心算法

硬币问题

在这里插入图片描述
   根据贪心选择性质:一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解 。

算法步骤:

(1) 输入货币面值列表V和需要支付的价钱A;
(2) def func(V, A):
(3) V.sort(reverse=True) # 将货币面值排序,大的在前面,表示优先使用
(4) total = 0 # 整体用的货币的个数
(5) for i in range(len(V)):
(6) t = A / V[i]
(7) A = A - t * V[i]
(8) total += t
(9) return total

代码实现:

def func(V, A):
    V.sort(reverse=True) # 将货币面值排序,大的在前面,表示优先使用
    total = 0 # 整体用的货币的个数
    for i in range(len(V)):
        t = A // V[i]
        A = A - t * V[i]
        total += t
    return total

print(func([1, 5, 10, 50, 500],620))

运行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/playboygogogo/article/details/108162981