【问题标题】:Most optimal coin fit for a given sum of money最适合给定金额的硬币
【发布时间】:2012-10-01 04:59:00
【问题描述】:

在给定一组硬币的情况下,你如何以最优化的方式达到给定的总和?

假设在这种情况下,我们有 1、5、10、20 和 50 美分硬币的随机数字,其中最大的硬币优先。

我的第一个直觉是使用所有可能适合的最大硬币,然后如果超过总和,则使用价值下一个最小的硬币。

这种方法是否可行或有任何不足之处?有没有更有效的方法?

【问题讨论】:

  • 看看wcipeg.com/wiki/…,它解释了这个确切概念以及如何使用动态规划来解决它。
  • 您首先必须检查给定的一组硬币 C(在您的示例中为 C={1,5,10,20,50})是否是规范的(或在某些文章中是有序的)。如果它是贪心算法给出任何给定数量的最佳答案,如果不是那么你必须回退 dp 以获得最佳答案

标签: algorithm combinations


【解决方案1】:

简单地先分发最大的硬币是有缺陷的。

假设您的自动售货机已售完所有硬币,但 50c、20c 和 1c 硬币各有 20 个,而您必须交付 60c 的零钱。

“优先级最大”(或贪婪)方案将给您 11 个硬币、1 个 50c 硬币和 10 个 1c 硬币。

更好的解决方案是三个 20c 硬币。

贪心方案只会为您提供本地最佳解决方案。对于全局最优,您通常需要检查所有可能性(尽管可能存在 minimax 类型的算法来减少搜索空间)以确定哪些可能性对于交付更改通常完全在可计算性的限制范围内。

【讨论】:

    【解决方案2】:

    Greedy Algorithms(您现在正在做的事情)通常被选择用于此类事情并实现为 Final State Machines 以用于自动售货机(对于这种特殊情况)。

    贪心算法确定要给的最小硬币数量 在做出改变的同时。这些是人类模仿的步骤 贪心算法

    【讨论】:

    • 值得注意的是,这确实假设硬币面额是经过智能选择的——因为它们通常是现实世界的货币。在 random 面额的情况下,这无法产生最佳选择(参见@paxdiablo 的 50c/20c/1c 示例)。
    • @lc:确实。这是贪心算法的局限性。我举了自动售货机的例子,因为它们通常处理相对较少的数字。
    【解决方案3】:

    每次用尽最大面额的假设不会是最好的解决方案。示例:

    Input: coins[] = {25, 10, 5}, V = 30
    Output: Minimum 2 coins required
    We can use one coin of 25 cents and one of 5 cents 
    
    Input: coins[] = {9, 6, 5, 1}, V = 11
    Output: Minimum 2 coins required
    We can use one coin of 6 cents and 1 coin of 5 cents (min)
    As per logic of exhausting largest coins first, we would end up with one
    coin of 9 cents and 2 coins of 1 cent
    

    请参阅this answer 以获得更多说明。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多