【问题标题】:Brute force solution returns wrong answer for Project Euler problem 31蛮力解决方案返回 Project Euler 问题 31 的错误答案
【发布时间】:2020-02-08 23:05:01
【问题描述】:

Project Euler problem 31 有问题。 正确答案是 73,682,我的答案是 73,681。 问题来了:

在英国,货币由英镑 (£) 和便士 (p) 组成。一般流通的硬币有八种: 1p、2p、5p、10p、20p、50p、1 英镑 (100p) 和 2 英镑 (200p)。

可以通过以下方式赚取 2 英镑: 1×£1 + 1×50p + 2×20p + 1×5p + 1×2p + 3×1p。

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

还有我的代码:

counter = 0
for a in range(3):
    for b in range(5):
        if 100 * a + 50 * b > 200:
            break
        for c in range(11):
            if 100 * a + 50 * b + 20 * c > 200:
                break
            for d in range(21):
                if 100 * a + 50 * b + 20 * c + 10 * d > 200:
                    break
                for e in range(41):
                    if 100 * a + 50 * b + 20 * c + 10 * d  + 5 * e > 200:
                        break
                    for f in range(101):
                        if 100 * a + 50 * b + 20 * c + 10 * d + 5 * e + 2 * f <= 200:
                            counter += 1
print(counter)

【问题讨论】:

  • 您的解决方案差 1;看起来您只是错过了可以使用 2 英镑硬币而不是其他任何东西的情况。
  • 为了匹配你可以使用itertools模块的不同方式,请看这里:docs.python.org/3/library/itertools.html
  • @kaya3 是对的,代码中的任何地方都没有“200 * X”。但是不要为此添加循环,只需从 counter 开始,就可以了。顺便说一句,欢迎来到 Stack Overflow!查看tour 和How to Ask。

标签: python


【解决方案1】:

问题在于您的代码没有考虑您只有 2 英镑硬币的情况。您只需将变量 counter 初始化为 1 即可解决此问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 1970-01-01
    相关资源
    最近更新 更多