(itertools.combination) Python Оболочка висит больше указанного размера c и выдает ошибку памяти - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь запустить указанный код c, чтобы найти сумму всех возможных комбинаций списка, поступающего из файла .in. Тот же код, при работе с относительно небольшими файлами, отлично работает, с большими файлами зависает и через некоторое время выдает MEMORY ERROR

import itertools

file = open("c_medium.in","r")
if file.mode=='r':
    content = file.readlines()
    maxSlices,numberOfPizza = map(int,content[0].split())
    numberOfSlices = tuple(map(int,content[1].split()))
    print(maxSlices)
    print(numberOfSlices)
    sol = []
    sumOfSlices = []
    for x in range(1,len(numberOfSlices)+1):
        print(x)
        for y in itertools.combinations(numberOfSlices,x):
            if sum(y) <= maxSlices:
                sumOfSlices.append(sum(y))
    sumOfSlices.sort()
    print(sumOfSlices)
    checkSum = sumOfSlices[len(sumOfSlices)-1]
    print(checkSum)
    found = False
    if found == False:
        for x in range(1,len(numberOfSlices)+1):
            print(x)
            for y in itertools.combinations(numberOfSlices,x):
                if found == False:
                    if sum(y) == checkSum:
                        for z in y:
                            sol.append(numberOfSlices.index(z))
                        found = True
    solution = tuple(map(str,sol))
    print(solution)

1 Ответ

0 голосов
/ 20 февраля 2020

Количество комбинаций из N элементов растет очень, очень быстро с N.

Что касается вашего кода, в частности, если (sum(y) <= maxSlices) всегда верно, то вы будете создать список с 2^(numberOfSlices) элементами. т.е. вы переполните 32-битное целое число, если numberOfSlices=32.

Я бы порекомендовал попытаться решить вашу задачу без явного построения списка. Если вы опишите, что делает ваш код, возможно, кто-то может помочь.

...