我的口袋里有15美元。同样,我在一家没有零钱的商店。在浏览时,我发现一个售价10美元(含税)的商品。我可以在不损失任何钱的情况下购买该物品吗?
在这种情况下,答案是肯定的。无论我的15美元如何分配(一个10和一个5,或三个5,等等),我总是会得到需要的10美元。
再举一个例子,我的口袋里有0.16美元。我还必须支付其他多少钱?
Possible Divisions:
0.01, 0.05, 0.10
0.01, 0.05 x 3
0.01 x 16
Guaranteed Exact Change:
0.01, 0.05, 0.06, 0.10, 0.11, 0.15, 0.16
如果我口袋里有0.27美元怎么办?
Possible Divisions:
0.01 x 2, 0.25
0.01 x 2, 0.05, 0.10 x 2
0.01 x 2, 0.05 x 3, 0.10
0.01 x 2, 0.05 x 5
0.01 x 27
Guaranteed Exact Change:
0.01, 0.02, 0.25, 0.26, 0.27
在上述情况下,只有很少的钱我会一直零花钱。
你的任务
编写最短的程序(或命名函数),该程序以A)整数金额和B)可能面额的清单作为输入,并输出必须有零钱的清单。输入可以是STDIN或程序或函数的参数。我不会对输入格式设置过多的限制;它可以匹配您的语言格式化数组的方式。
也许更详细的解释
我的口袋里有一定数量的钱,这是由一组可能的货币演示形成的。如果我有8美元,并且我知道可能的面额是2美元和3美元,那么我的口袋里可能只有这么多不同的钞票组合。这些是2+2+2+2
和3+3+2
。为了能够产生精确的金额,我必须能够仅使用口袋里的钞票来产生该金额。如果我有四个2,我可以产生2, 4, 6, or 8
。如果我有两个3和一个2,我可以生产。2, 3, 5, 6, or 8
由于我不知道口袋里到底有哪种组合,所以我的最终答案是2, 6, 8
。鉴于总金额和可能的面额,这些是我知道可以从口袋里产生的价值。
手动计算的示例I / O
7 [3, 4]
3, 4, 7 //only one possible division into 3 + 4
7 [3, 2]
2, 3, 4, 5, 7 //the only division is 3 + 2 + 2
6 [2, 3, 4]
6 //divisions are 2+2+2, 3+3, 2+4
16 [1, 5, 10, 25] //this represents one of the examples above
1, 5, 6, 10, 11, 15, 16
27 [1, 5, 10, 25] //another example from above
1, 2, 25, 26, 27
1500 [1, 5, 10, 25, 100, 500, 1000, 2000]
500, 1000, 1500
600 [100, 500, 1000, 2000]
100, 500, 600
600 [200, 1, 5, 10, 25, 100, 500, 1000, 2000]
600
6 [2, 3, 4]
。不能2+2+2
没有使3,并3+3
没有使2和4?