小编典典

确定硬币组合的算法

algorithm

最近,我面对一个提示,要求提供一种编程算法,但我不知道该怎么做。我以前从未真正编写过算法,所以对此我有点陌生。

问题是写一个程序来确定收银员可以根据硬币价值和硬币数量找回所有可能的硬币组合。例如,可能有一种带有4个硬币的货币:2分,6分,10分和15分硬币。有多少等于50美分的组合?

我使用的语言是C ++,尽管这并没有太大关系。

编辑:这是一个更具体的编程问题,但是我将如何分析C ++中的字符串以获得硬币值?它们在文本文件中给出,例如

4 2 6 10 15 50

(在这种情况下,数字与我给出的示例相对应)


阅读 224

收藏
2020-07-28

共1个答案

小编典典

这似乎有点像分区,只是您没有在1:50中使用所有整数。它似乎也类似于垃圾箱包装问题,只是存在细微差别:

实际上,考虑之后,它是一个ILP,因此是NP难的。

我建议使用一些动态编程方法。基本上,您将定义一个值“ remainder”并将其设置为您的目标(例如50)。然后,在每一步中,您将执行以下操作:

  1. 找出剩下的最大硬币
  2. 考虑一下如果您(A)包含该硬币或(B)不包含该硬币会发生什么。
  3. 对于每种情况,请递归。

因此,如果余数是50,最大的硬币分别价值25和10,则您将分为两种情况:

1. Remainder = 25, Coinset = 1x25
2. Remainder = 50, Coinset = 0x25

下一步(对于每个分支)可能如下所示:

1-1. Remainder = 0,  Coinset = 2x25 <-- Note: Remainder=0 => Logged
1-2. Remainder = 25, Coinset = 1x25
2-1. Remainder = 40, Coinset = 0x25, 1x10
2-2. Remainder = 50, Coinset = 0x25, 0x10

每个分支将分为两个分支,除非:

  • 其余为0(在这种情况下,您将其记录)
  • 其余的小于最小的硬币(在这种情况下,您将其丢弃)
  • 没有更多的硬币了(在这种情况下,由于剩余!= 0,您将丢弃它)
2020-07-28