最近,我面对一个提示,要求提供一种编程算法,但我不知道该怎么做。我以前从未真正编写过算法,所以对此我有点陌生。
问题是写一个程序来确定收银员可以根据硬币价值和硬币数量找回所有可能的硬币组合。例如,可能有一种带有4个硬币的货币:2分,6分,10分和15分硬币。有多少等于50美分的组合?
我使用的语言是C ++,尽管这并没有太大关系。
编辑:这是一个更具体的编程问题,但是我将如何分析C ++中的字符串以获得硬币值?它们在文本文件中给出,例如
4 2 6 10 15 50
(在这种情况下,数字与我给出的示例相对应)
这似乎有点像分区,只是您没有在1:50中使用所有整数。它似乎也类似于垃圾箱包装问题,只是存在细微差别:
实际上,考虑之后,它是一个ILP,因此是NP难的。
我建议使用一些动态编程方法。基本上,您将定义一个值“ remainder”并将其设置为您的目标(例如50)。然后,在每一步中,您将执行以下操作:
因此,如果余数是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
每个分支将分为两个分支,除非: