【问题标题】:Find combination of bank notes for particular sum查找特定金额的钞票组合
【发布时间】:2016-06-27 18:56:18
【问题描述】:

如何有效地发行货币。例如,如果您有 1 张 100 美元的钞票、1 张 50 美元的钞票和 2 张 30 美元的钞票。如何确定我们需要 50 美元和 30 美元中的两个来实现 110 美元的汇总。

换句话说,我们有固定数量的钞票类型:30 美元(两张钞票)、50 美元(一张钞票)、100 美元(一张钞票)。问题是要确定我们应该拿哪些钞票来获得特定的金额,例如 110 美元?在这种情况下,我们应该取两张 30 美元的钞票和一张 50 美元的钞票。

这里不能使用贪心算法,因为如果我们先拿 100 美元的钞票,那么我们就无法实现 110 美元的汇总。

我们需要使用哪种数据结构来存储钞票?只是每种钞票类型的数量,也可以是存储每张钞票的数组:[100, 50, 30, 30]

找到我们需要哪些钞票来获得特定金额的算法是什么?

【问题讨论】:

  • 有很多相关的问题,虽然这些问题通常使用硬币。我现在找不到完全相同的副本。你试过searching吗?
  • 广义,这是子集和问题(en.wikipedia.org/wiki/Subset_sum_problem)。标准解决方案是 O(2^(n/2))。还有一个可能的伪多项式解。

标签: algorithm


【解决方案1】:

您可以使用动态编程方法。您保留一个数组,其中 index 是可达到的总和,而 value - 账单编号,通过它达到这个总和。

此方法用于Emercoin 事务优化器。 查看源代码:

https://github.com/Emercoin/emercoin/blob/master/src/wallet.cpp#L1112

内存是 O(Sum);时间为 O(Sum * NumBills); 请参阅有关它的简短文章:

http://cointelegraph.com/news/emercoin-implements-solution-to-reduce-blocksize-inflation

【讨论】:

    【解决方案2】:

    在这个问题中查看我的解决方案Coin Change Problem

    同样对于此类问题,困难的部分始终是确定硬币/货币系统是否规范即可以使用贪心算法

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 2016-11-18
      • 1970-01-01
      • 2014-08-04
      • 2017-01-31
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      相关资源
      最近更新 更多