Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 欧拉计划挑战31的逻辑谬误_Python_Algorithm_Dynamic Programming_Combinatorics - Fatal编程技术网

Python 欧拉计划挑战31的逻辑谬误

Python 欧拉计划挑战31的逻辑谬误,python,algorithm,dynamic-programming,combinatorics,Python,Algorithm,Dynamic Programming,Combinatorics,也许我误解了这个问题。对于那些不熟悉的人,这里有一个问题: 调查英国货币面额的组合。 在英国,货币由英镑、英镑和便士、便士组成,在一般流通中有八种硬币: 1便士、2便士、5便士、10便士、20便士、50便士、1100便士和2200便士 可以通过以下方式获得2英镑: 1×1+1×50p+2×20p+1×5p+1×2p+3×1p 使用任意数量的硬币可以用多少种不同的方式制造2英镑 我知道这是一个动态规划问题,但我忍不住走了一条捷径: 为了解决这个问题,我详细分析了使用1p、1p和2p以及1p、2p和

也许我误解了这个问题。对于那些不熟悉的人,这里有一个问题:

调查英国货币面额的组合。 在英国,货币由英镑、英镑和便士、便士组成,在一般流通中有八种硬币:

1便士、2便士、5便士、10便士、20便士、50便士、1100便士和2200便士

可以通过以下方式获得2英镑:

1×1+1×50p+2×20p+1×5p+1×2p+3×1p

使用任意数量的硬币可以用多少种不同的方式制造2英镑

我知道这是一个动态规划问题,但我忍不住走了一条捷径:

为了解决这个问题,我详细分析了使用1p、1p和2p以及1p、2p和5p硬币制造一到六便士的方法

只使用一便士硬币 1组合 1p 1组合 2×1p 1组合 3×1p 1组合 4×1p 1组合 5×1p 1组合 6×1p 只使用一便士和两便士硬币 1组合 1p 2种组合 2p 2×1p 2种组合 2p+1p 3×1p 3种组合 2×2p 2p+2×1p 4×1p 3种组合 2×2p+1p 2p+3×1p 5×1p 4种组合 3×2p 2×2p+2×1p 2p+4×2p 6×2p 只使用一便士、两便士和五便士硬币 1组合 1p 2种组合 2p 2×1p 2种组合 2p+1p 3×1p 3种组合 2×2p 2p+2×1p 4×1p 4种组合 5p 2×2p+1p 2p+3×1p 5×1p 5种组合 5p+1p 3×2p 2×2p+2×1p 2p+4×2p 6×2p 我注意到这种疯狂有一种模式。显然,只有一种类型的硬币,最多只能有一种方法来获得所需的余额。就这个问题而言,没有必要解释一分钱的零头。因此,仅使用一便士硬币,就有一种方法可以获得任何非负余额。请注意,只有一种方法可以获得零的余额:没有硬币

快速看了一眼,我注意到第二个示例中有一个模式。可能的组合数等于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。显然你的假设是错误的


错误在于,您只是简单地尝试了一些案例,并假设适用于一些小案例的方法适用于所有案例,而没有任何证据。

仅使用[1,2,5]生成10p的正确组合数是10,而您的解决方案给出了10/5+10/2+1=2+5+1=8。显然你的假设是错误的


错误在于,您只是简单地尝试了几个案例,并假设适用于几个小案例的方法适用于所有案例,而没有任何证据。

我不确定是否可以解释它的错误之处,但您的公式不适用于n>=7。@Blckknght,您的问题很有趣。否,当n为7时,输出为5。然而,我发现答案实际上是6。也许我的逻辑只是碰巧适用于给定的例子?我还刚刚确认它对8、9或10不起作用。我不确定是否能解释它哪里出了问题,但你的公式对n>=7不起作用。@Blckknght,你问这个问题很有趣。否,当n为7时,输出为5。然而,我发现答案实际上是6。也许我的逻辑只是碰巧适用于给定的例子?我还刚刚确认了它不适用于8、9或10。刚刚在上面确认。正确的解决方案对我来说仍然有点牵强。:/不过,如果解决方案如此之小,我想问题也不会那么棘手。回到绘图板上。@TylerCrompton:解决方案确实是动态编程,如果您以前解决过DP问题,就不会特别困难了。如果你陷入困境,请告诉我。我已经解决了我的DP问题,所以我应该能够处理它。回顾我的解决方案,我不知道为什么我认为这是正确的*耸耸肩*这就是演绎逻辑相对于归纳逻辑在数学中如此重要的原因:动态规划不是这里唯一的解决方案
尽管它可以说是最好的。递归解决方案在这里也能很好地工作。刚刚在上面确认过。正确的解决方案对我来说仍然有点牵强。:/不过,如果解决方案如此之小,我想问题也不会那么棘手。回到绘图板上。@TylerCrompton:解决方案确实是动态编程,如果您以前解决过DP问题,就不会特别困难了。如果你陷入困境,请告诉我。我已经解决了我的DP问题,所以我应该能够处理它。回顾我的解决方案,我不知道为什么我认为这是正确的*耸耸肩*这就是演绎逻辑相对于归纳逻辑在数学中如此重要的原因:动态规划不是这里的唯一解决方案,尽管它可以说是最好的。递归解决方案在这里也很有效。