也许我误解了这个问题对于不熟悉Project Euler's Problem 31的人,这里有一个问题:
调查英国货币面额的组合。
在英国,货币是由英镑和便士组成的,一般流通的硬币有八种:
1便士、2便士、5便士、10便士、20便士、50便士、1英镑(100便士)和2英镑(200便士)。
可以通过以下方式赚2英镑:
1×1+1×50p+2×20p+1×5p+1×2p+3×1p
使用任意数量的硬币可以用多少种不同的方法来制作2英镑?
我知道这是一个动态编程问题,但我忍不住走了一条捷径:
为了解决这个问题,我分解了用1P、1P和2P,以及1P、2P和5P硬币可以赚一到六便士的几种方法。
只使用一便士硬币
1个组合
1便士
1个组合
2×1便士
1个组合
3×1便士
1个组合
4×1便士
1个组合
5×1便士
1个组合
6×1便士
只使用一便士和两便士的硬币
1个组合
1便士
2种组合
2便士
2×1便士
2种组合
2P+1P
3×1便士
3种组合
2×2便士
2P+2×1P
4×1便士
3种组合
2×2p+1p
2P+3×1P
5×1便士
4种组合
3×2便士
2×2p+2×1p
2p+4×2p
6×2便士
只使用一便士、两便士和五便士的硬币
1个组合
1便士
2种组合
2便士
2×1便士
2种组合
2p+1p
3×1便士
3种组合
2×2便士
2p+2×1p
4×1便士
4种组合
5便士
2×2p+1p
2p+3×1p
5×1便士
5种组合
5P+1P
3×2便士
2×2p+2×1p
2p+4×2p
6×2便士
我注意到这种疯狂有一种模式显然,只有一种硬币可以达到想要的“平衡”就这个问题而言,一分钱也不必算因此,仅使用一便士硬币,就有一种方法可以获得任何非负平衡。请注意,只有一种方法可以获得零的余额:没有硬币。
我匆匆看了一眼,注意到第二个例子中有一个模式可能的组合数等于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这个数字对我来说很有意义,不过,我不会自己写所有可能的组合但是,project euler声明这是不正确的。
我在网上发现正确的答案是73682。
所以我的问题是,那些还在阅读的堆栈溢出用户,我的推理谬误在哪里?

最佳答案

只使用[1,2,5]来制作10p的正确组合数是10,而你的溶液给出的是10/5+10/2+1=2+5+1=8显然你的假设是错误的。
错误在于,你只是在尝试几个案例,假设对几个小案例有效的东西对所有案例都有效,而没有任何证据。

关于python - 欧拉项目挑战的逻辑谬误31,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12191069/

10-12 22:03