Суммируйте элемент чисел, чтобы получить желаемый результат - PullRequest
0 голосов
/ 28 апреля 2020

Используя фрагмент

import itertools
numbers = [1,2,3,4,5]
results = [7,8]
allcombs = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) in results]

print(allcombs)

, я могу получить все комбинации, которые дают мне желаемый результат. Основная проблема здесь заключается в том, что число не должно повторяться. Таким образом, вместо результата

[(1, 2, 4), (1, 2, 5), (1, 3, 4), (2, 5), (3, 4), (3, 5)]

мне нужно получить

[(1, 2, 4),(3, 5)]

Все элементы результатов не должны содержаться в комбинации чисел.

Редактировать:

1 Решение

usednumbers = []
newresult = []
for comb in allcombs:
    if not any(a in usednumbers for a in comb):
        newresult.append(comb)
        for n in comb:
            usednumbers.append(n)

print(newresult)

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

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

Кроме того, комбинации должны генерироваться с индексами в дополнение к самим числам, чтобы упростить определение оставшихся значений, когда список содержит повторяющиеся числа.

from itertools import combinations

def comboToSums(numbers,results,size=None):
    if size is None: size = len(numbers)
    if size == 0: return []
    for combo in combinations(enumerate(numbers),size):
        indexes,values = zip(*combo)
        if sum(values) not in results: continue
        remaining = [n for i,n in enumerate(numbers) if i not in indexes]
        return [values] + comboToSums(remaining,results)
    return comboToSums(numbers,results,size-1)

вывод:

numbers = [1,2,3,4,5]
results = [7,8]
c = comboToSums(numbers,results)
print(c) # [(1, 2, 4), (3, 5)]
0 голосов
/ 28 апреля 2020

Может быть, это?

numbers = [1,2,3,4,5]
results = [7,8]

result = [[] for item in results]

for item in numbers:
    current = 0
    while current < len(results):
        if (sum(result[current]) + item) <= results[current]:
            result[current].append(item)
            current = len(results)
        else:
            current += 1
...