我正在写python,这就是我要做的事情: 输入的第一行包含板数n(1≤n≤1000)。以下n行中的每一行包含一个小于或等于1000的正整数,表示每个板的重量。输出一个整数,组合权重最接近1000.如果存在两个同样接近1000的数字(例如998和1002),则选择较大的数字(在本例中为1002)。
我的代码现在看起来像这样:
from itertools import permutations, chain
N=int(input())
s=0
vikter=[]
while (N>s):
vikt=int(input())
vikter.append(vikt)
s=s+1
c = chain(*(list(permutations(vikter, i)) for i in range(1, len(vikter) + 1)))
result = min(c, key = lambda x: (abs(sum(x) - 1000), -sum(x)))
print(result)
但是这段代码给了我这个内存错误:
Traceback (most recent call last):
File "C:\Users\Hanna\Documents\walrusweights.py", line 9, in <module>
c = chain(*(list(permutations(vikter, i)) for i in range(1, len(vikter) + 1)));
File "C:\Users\Hanna\Documents\walrusweights.py", line 9, in <genexpr>
c = chain(*(list(permutations(vikter, i)) for i in range(1, len(vikter) + 1)));
MemoryError
我该怎么做才能避免此错误?
答案 0 :(得分:0)
您的问题是您在不适用的情况下使用蛮力。您正在尝试生成列表的所有可能排列(在最坏的情况下)为1000个元素。列表等排列的数量为1000!,这个数据太大,无法在此Universe的生命周期内处理。相反,您可以查看动态编程或分支定界算法来实现此问题。