在当前项目中,人们可以订购送货上门的货物并选择“按交货付款”作为付款选项。为确保送货员有足够的更改,要求客户输入他们将支付的金额(例如,送货是48,13,他们将用60, - (3 * 20, - ))支付。现在,如果这取决于我,我会让它成为一个自由的领域,但是明显更高级的决定应该是基于可用面值的选择,而不会给出导致一组面值可能更小的面值的量。基于面值的特定价格支付的算法可能的金额(大于)
例子:
denominations = [1,2,5,10,20,50]
price = 78.12
possibilities:
79 (multitude of options),
80 (e.g. 4*20)
90 (e.g. 50+2*20)
100 (2*50)
它是国际性的,因此面额可以改变,算法应基于在此列。
我来最接近这似乎工作是这样的:
for all denominations in reversed order (large=>small)
add ceil(price/denomination) * denomination to possibles
baseprice = floor(price/denomination) * denomination;
for all smaller denominations as subdenomination in reversed order
add baseprice + (ceil((price - baseprice)/subdenomination) * subdenomination) to possibles
end for
end for
remove doubles
sort
是似乎工作,但这已经出现后疯狂地尝试各种紧凑的算法,我不能捍卫为什么它有效,这可能会导致一些边缘/新的国家出现错误的选择,并且确实会产生大量的双打。
由于这可能不是一个新问题,而Google等人。除了大量的页面计算如何进行确切的改变之外,我无法给出答案,我想我会问:你之前是否解决过这个问题?哪种算法?任何证明它将始终有效?
+1犯它 – 2010-06-05 17:43:53
可我只是说,如果“货物”是任何类似的比萨饼,你可能得太多的方式在此之前质疑你的解决方案? (有趣的算法问题虽然...做进行!) – 2010-06-05 18:21:00
嘿,没有选择过时它,我已经准备好在输入字段中投入任何东西到整数,并让客户自己处理奇怪的脑袋:)大约需要2分钟,而不是3小时,还有许多失败的战术:)我挑战了任务,没有赢得争论,现在我必须忍受它,因为我缺乏说服力...... – Wrikken 2010-06-05 18:35:34