也许我误解了这个问题。对于那些不熟悉Project Euler's Problem 31的人,问题是:
调查英国货币面额的组合。
在英格兰,货币由英镑,英镑和便士,p组成,一般流通中有八个硬币:
1p,2p,5p,10p,20p,50p,£1(100p)和£2(200p)。
可以通过以下方式赚取2英镑:
1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p
使用任意数量的硬币可以使用多少种不同的方式?
我看到这可能是一个动态编程问题,但我忍不住走捷径:
为了解决这个问题,我分解了使用1p,1p和2p以及1p,2p和5p硬币可以达到1到6便士的方式。
我注意到这种疯狂有一种模式。显然,最多只有一种方法可以用一种硬币获得所需的“平衡”。对于这个问题的情况,没有必要考虑一分钱的分数。因此,仅使用一个便士硬币,只有一种方法可以获得任何非负余额。请注意,只有一种方法可以获得零余额:没有硬币。
快速浏览一下,我注意到第二个例子中有一个模式。可能组合的数量等于n / 2加1的商,其中n是任何非负整数。在Python(我编写解决方案的语言)中,如下所示:
n // 2 + 1
我注意到+ 1
正在为特定的“目标余额”添加上一个示例的结果。巧合?也许。但在看了第三个例子后,我很快注意到可能的组合数量如下:
n // 5 + n // 2 + 1
我实施了这种模式,它将占所有八个硬币:
n // 200 + n // 100 + n // 50 + n // 20 + n // 10 + n // 5 + n // 2 + 1
当n
设置为200时,我推断答案是178.这个数字对我来说很有意义,但是,我不会自己编写所有可能的组合。但是,欧拉计划指出这是不正确的。
我在网上发现正确的解决方案是73682。
所以我的问题是,Stack Overflow用户还在阅读,我推理的谬误在哪里?
答案 0 :(得分:6)
仅使用[1,2,5]制作10p的正确组合数是10,而你的解决方案给出10/5 + 10/2 + 1 = 2 + 5 + 1 = 8.显然你的假设不正确
错误在于您只是尝试了几个案例并假设适用于少数案例的案例适用于所有案例,而没有任何证据。