硬币更改算法的贪婪算法有什么不好的情况?

时间:2017-02-14 11:31:23

标签: algorithm

硬币更换问题是使用最少数量的硬币进行n美分的更改。

你能给出一组硬币面额,贪婪算法不会产生最佳解决方案。该集应包括一分钱,以便每个n都有一个解决方案。

3 个答案:

答案 0 :(得分:4)

好吧,给定10, 7, 1个硬币改变15

15 = 10 + 1 + 1 + 1 + 1 + 1 // greedy  (6 coins)
15 =  7 + 7 + 1             // optimal (3 coins)

您可以根据需要轻松生成贪婪的解决方案效率低下: 让可用的硬币为1N-1N并尝试更改2 * N - 1

 N, 1, 1, ..., 1 // greedy  (N coins)
 N-1, N-1, 1     // optimal (3 coins)

现在,让N变大

答案 1 :(得分:2)

硬币: 1,5,8 金额: 10
贪心解决方案: 8,1,1(3个硬币)
最佳: 5,5(2个硬币)

要扩展@xenteros评论,请查看wikipedia(其中顺便说一下。你会找到一个例子):

  

对于所谓的典型硬币系统,如美国和美国使用的系统   许多其他国家,选择最大的贪婪算法   硬币面额不大于剩余金额   制作将产生最佳结果。事实并非如此   但是,任意硬币系统:如果硬币面额是1,3   4,然后做6,贪心算法会选择三个硬币   (4,1,1),而最优解是两个硬币(3,3)。

答案 2 :(得分:0)

当可用硬币数量有限时,贪婪算法将无法始终起作用。假设您的收银机中有以下物品:

  • 50美元:3张钞票
  • 10美元:11张钞票
  • 5美元:6张钞票
  • $ 1:9张钞票
  • 四分之一:55个硬币
  • 角钱:47个硬币
  • 镍:无
  • 便士:4个硬币

一位顾客进来,买了价值69美分的糖果,用1美元的钞票付款,需要找零31美分。

贪婪算法将首先选择四分之一,然后需要再选择6美分。没有镍币,只有4便士。因此,它将找不到正确的更改。使用动态编程可以找到正确的变化(3角钱和1便士)。