我被要求做以下事情: 如果可以购买x,x + 1,......,x + 5套McNuggets,对于某些x,则可以购买任意数量的McNuggets> = x,因为McNuggets分别为6,9和20包。编写一个迭代程序,找出无法以精确数量购买的最大数量的McNuggets。
这是我提出的代码,但它陷入无限循环:
count = 0
n = 1
while count < 6:
six_consequtive = True
for a in range(n):
for b in range(n):
for c in range(n):
if 6*a + 9*b + 20*c == n:
six_consequtive = False
if six_consequtive:
count += 1
else:
count = 0
n += 1
print("Largest number of McNuggets that cannot be bought in exact quantity: %d." % (n - 5))
非常感谢!
答案 0 :(得分:0)
似乎很清楚问题是什么:只有在可以获得确切数量时才会增加count
。每当你不增加count
时,你将它重置为0,并且当循环超过6时循环才会停止。这可能需要一段时间。
你编写了一个三重嵌套的for
循环,因此得到的n
越大,这些循环越慢。如果你让它运行得足够长,它可能会成功并在某一天结束;但是你的基本算法太慢了。
您可以通过使用print语句设置循环来了解更多信息。当我尝试它时,我没有得到输出;我想这可能是由于缓冲问题,所以我写了一个简单的输出函数,输出一个字符串,然后刷新,以确保我可以立即看到输出。
以下是您编辑的程序:
import sys
def out(s):
sys.stdout.write(s + "\n")
sys.stdout.flush()
count = 0
n = 1
while count < 6:
six_consecutive = True
for a in range(n):
for b in range(n):
for c in range(n):
#out("a: %d b: %d c: %d n: %d" % (a, b, c, n))
if 6*a + 9*b + 20*c == n:
six_consecutive = False
out("n == %d count == %d six_consecutive == %s" %
(n, count, str(six_consecutive)))
if six_consecutive:
count += 1
else:
count = 0
n += 1
print("Largest number of McNuggets that cannot be bought in exact quantity: %d." % (n - 5))
我还修改了“six_consecutive”的拼写。
那么,你应该怎么解决这个问题呢?我认为你应该扔掉它并用更好的算法重写。您可能想检查并查看其他人如何解决此问题或类似问题。当我给出一组不同面额的硬币时,这让我觉得非常类似于如何改变的经典问题。
注意:做出改变的经典问题通常是假定一组合理的硬币,包括一个价值为1的硬币。一个简单的“贪婪”算法,从最大的硬币开始算起来,总是会成功。这更有趣,因为“硬币”设置很奇怪,并且有些值无法找到,所以也许经典的硬币问题并不像我想的那么重要。
答案 1 :(得分:0)
对不起,我刚才意识到我的布尔值已经反转了。循环开头的第一个6_consequtive应分配为False,第二个为True。 再一次,我对这个愚蠢的问题感到非常抱歉。