你走进商店,选择几种产品,然后去柜台付账单。总数是一些金额(A
)。你进入你的钱包,钱包或口袋,放下一些现金(P
),P
> = A
,收银员给你更改。
考虑到流通的硬币和账单的集合,P
最有可能的价值是什么?
一些例子,假设可用的账单是5美元,10美元,20美元,50美元和100美元,可用的硬币是5c,10c和25c:
A
= $ 151.24
P[1]
= $ 160(8x $ 20)或($ 100 + 3x $ 20)
P[2]
= $ 155($ 100 + $ 50 + $ 5)
A
= 22.65美元({1}} = 25美元(20美元+ 5美元)
P[1]
= 30美元(20美元+ 10美元)
{{1} } = $ 40($ 20 + $ 20)
P[2]
= $ 0.95
P[3]
= $ 1(4 x 25c)
A
= $ 5
这些数字中有许多似乎很直观,但我觉得算法难以确定。
答案 0 :(得分:2)
“最有可能”使这成为一个非常棘手的问题。您需要知道每种货币的相对可用性和分布。例如,流通中所有票据的22%是20美元,这使得它们比10美元或50美元的票据更有可能被使用,金额在10美元到100美元之间。
答案 1 :(得分:2)
这实际上是一个已知问题,如果我没弄错的话,它是binpacking的变体......
有时它被称为收银员算法(或greedy algorithm)。您可以在此演示文稿中找到实现:http://www.cs.princeton.edu/~wayne/kleinberg-tardos/04greed.pdf,请参阅第11/12/13页..
(澄清一下,普通的收银员算法只返回支付客户所需的最小金额。但你可以改变动态编程解决方案来计算所有可能的组合)
答案 2 :(得分:2)
还有其他因素,你不太可能用6 x 0.25付费,你会用1 x 1.00和2 x 0.25代替。通常0.25不会超过3,0.10不会超过2,而0.05将不会超过1。
同样在现实世界中,许多人从不打扰低于1.00的价值,他们用票据支付并“保持变化”。
同样适用于5.00,10.00和20.00,对于购买而言,几美元的人将使用5.00或10.00。当然,由于ATM机,20.00是最常见的流通。
这个软件是什么用的?你真的在尝试模型实际购买并需要准确的结果,还是一个不必严格的简单模拟?
答案 3 :(得分:1)
OH!@#$%^& *()_,现在我真的很喜欢。
我只写了10分钟的伪代码和复杂度估计,当我发布时,只有“我是一个人”的按钮,没有任何机会输入内容,我的完整帖子已经消失了(当然,这次我没有制作编辑窗口的副本,以防万一...),好的所以这里是简短的版本:
硬币数量通常超级单调(即每个值>以前的值的总和),因此您可以使用贪婪来获得A的确切硬币。
现在使用这个多组硬币P,将它添加到(直到现在为空)结果集(一组多重集),以及(到现在为止空)工作集。
现在重复,直到工作集为空:
将P设置为工作集P'= P,对于P中的每个硬币c:P'= P.replace(c,nextBiggerCoin),removeSmallestCoin(只要没有最小硬币的P仍然> A)
如果P'尚未处于结果集中,请将其放入结果集和工作集
我猜测的复杂性是O(s * n ^ 2),其中s是解决方案的数量。
答案 4 :(得分:1)
这是一个销售点系统。在计算最终价格时,出纳员必须输入客户提供的现金金额。有三个“快捷”按钮应设置为“可能”金额,以使收银员的生活更轻松。绝对完美是没有必要的。 - eJames(11月19日22:28)
我认为没有一个完美的算法。如果我是你,我会找到大量现金交易的现有POS数据来源,并在特定的价格范围内进行评估。了解人们通常如何为特定价格范围付费(确切变化的可能性更大),并为最具差异化的范围制定出最合适的公式。
答案 5 :(得分:1)
我实际上是最终实现这个的人,所以我认为最好发布最终结果。它不漂亮,但它很快,没有任何循环或数组。我不认为这是概念问题的解决方案,但它确实解决了实际问题。
在大多数情况下,实际使用范围仅限于$ 5至$ 200范围。大多数人通常不会定期提取500美元现金:)
我决定查看从0到5美元,5美元到10美元的各种案例。 。 。 45至50美元。我们有3个按钮,所以在每种情况下,第一个按钮(最低)将是价格之上的下一个5美元价值。所以,如果它是7.45美元,那么8美元是第一个按钮,$ 13.34 - > 15美元,21.01美元 - > $ 25美元。
这留下了第2和第3个按钮。鉴于标准值为5美元,10美元,20美元,50美元的钞票,每个案例都有明显的答案。例如:看24.50美元,然后是1> 25美元,2美元,30美元,3美元,40美元。这些可以使用表格和一些常识找到。
我还发现,使用价值50美元以上的价格可以简单地匹配低于50美元的同行。即:72.01美元与22.01美元的答案相同,依此类推。唯一需要注意的是数字大于60且小于70.这种情况需要处理4个20美元钞票的可能性。
该算法还可以很好地扩展到100美元到200美元的范围。以上是零售业中罕见的案例。