【问题标题】:change (denominations) calculator更改(面额)计算器
【发布时间】:2012-11-17 19:23:32
【问题描述】:

我正在寻找一种计算零钱面额的解决方案。 我的问题是面额:50 和 20。

所以给定数量:130,应该有 1x50 + 4x20, 和数量:80,应该有0x50 + 4x20等。

我曾尝试查找硬币问题,但无法得到一个体面的答案,当面额超过 2 种类型时,硬币问题似乎有一堵墙(根据我的阅读)。

有没有完整的解决方案?或者最好是2种以上面额类型的解决方案?

我还希望能够提供每种可用面额的数量。

如果你能用 pseedo 代码解决,那么奖励

【问题讨论】:

标签: algorithm


【解决方案1】:

如果你只有两个教派,问题就变成了:

find x and y such that 
a*x + b*y = c

这可以使用Extended Euclidean Algorithm解决


如果您有超过 3 个面额,最常见的解决方案是使用动态编程来“蛮力”实现可能性。你可以检查这个类似的question

【讨论】:

  • 除了你正在寻找非负解决方案,这很复杂:有一个线性参数化的解决方案集与整数,然后你做例如。线性规划。对于超过 3 个变量,您可以使用左侧 1xn 矩阵的基本除数 (en.wikipedia.org/wiki/Smith_normal_form) 分解,该矩阵可在多项式时间内计算。您仍然必须限制非否定解决方案。
  • 我很高兴有一个仅适用于 2 个面额的解决方案。
  • 你能解释一下两种面额的解决方案吗?
【解决方案2】:

在 math.stackexchange.com 上查看相对但更一般的问题 looking-to-understand-the-rationale-for-money-denomination

还有making-change-for-a-dollar-and-other-number-partitioning-problems,它很好地解释了生成函数如何解决一般问题。

如果您的问题仅限于两个硬币,那就容易多了。

【讨论】:

    【解决方案3】:

    这是一个代码解决方案:http://www.codeproject.com/KB/recipes/coinChangeProblem.aspx

    不幸的是,代码真的很丑,但应该可以轻松清理

    【讨论】:

      【解决方案4】:

      你可以使用简单的“贪心算法”

      http://en.wikipedia.org/wiki/Greedy_algorithm

      【讨论】:

        【解决方案5】:

        只要继续减去最大面额即可。 IE 一直减去 50s,直到剩下的小于 50,然后继续减去 20s。无论您有多少面额,这都有效。

        【讨论】:

        • 贪心方法行不通:如果你想获得总共 80 美分,使用 50 和 20 美分硬币,唯一的解决方案是 4x20,但贪婪的解决方案在 50 + 20 后卡住
        • 这将在 130 上失败。它将删除 2x50,然后留下无法使用 20 年代的东西。
        • 是的,它只是一个垃圾算法,我没想到只解决 ax + by = c
        • 130 失败,无论你从 50 还是 20 开始!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-19
        • 1970-01-01
        • 2019-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-29
        相关资源
        最近更新 更多