如何有效地发行资金。例如,如果您有1张100美元的纸币,1张50美元的纸币和2张30美元的纸币。如何确定我们需要50美元和30美元中的两个来实现110美元的摘要。
换句话说,我们有固定数量的纸币类型:30美元(两张纸币),50美元(一张纸币),100美元(一张纸币)。问题是确定我们应该采取哪些钞票来获得特定金额,例如,110美元?在这种情况下,我们应该拿两张30美元的钞票和一张50美元的钞票。
我们不能在这里使用贪心算法,因为如果我们先拿100美元的钞票,那么我们就无法实现110美元的汇总。
我们需要使用哪种数据结构来存储钞票?只需每种纸币类型的数量,或者可以是存储每张纸币的数组:[100,50,30,30]
什么算法可以找到我们需要哪些钞票来获得特定金额?
答案 0 :(得分:0)
您可以使用动态编程方法。你保留一个数组,其中索引是可达的总和,以及值 - 账单数,通过它来达到这个总和。
此方法用于Emercoin事务优化器。 请参阅以下源代码:
https://github.com/Emercoin/emercoin/blob/master/src/wallet.cpp#L1112
记忆是O(总和);时间是O(Sum * NumBills); 请参阅有关它的简短文章:
http://cointelegraph.com/news/emercoin-implements-solution-to-reduce-blocksize-inflation
答案 1 :(得分:0)
同样对于这种问题,困难的部分总是要确定硬币/货币系统是否是规范的,即。可以使用贪心算法