Вот перебором решение. Он использует рецепт poweret от Itertools Recipes
в документах для создания всех подмножеств. Затем он сортирует и группирует их по сумме, используя itertools.groupby
. Затем, наконец, он проверяет все пары подмножеств с одинаковой суммой, чтобы найти пары, которые не пересекаются.
from itertools import chain, combinations, groupby
def equal_sum_partitions(seq):
subsets = chain.from_iterable(combinations(seq, r) for r in range(len(seq)+1))
for k, g in groupby(sorted(subsets, key=sum), key=sum):
group = [set(u) for u in g]
if len(group) > 1:
for u, v in combinations(group, 2):
if not u & v:
print(k, (u, v))
# test
equal_sum_partitions([2, 4, 8, 6, 3, 5])
выход
5 ({5}, {2, 3})
6 ({6}, {2, 4})
7 ({2, 5}, {3, 4})
8 ({8}, {2, 6})
8 ({8}, {3, 5})
8 ({2, 6}, {3, 5})
9 ({4, 5}, {3, 6})
10 ({8, 2}, {4, 6})
10 ({4, 6}, {2, 3, 5})
11 ({8, 3}, {5, 6})
11 ({8, 3}, {2, 4, 5})
13 ({8, 5}, {3, 4, 6})
14 ({8, 6}, {2, 3, 4, 5})
14 ({8, 2, 4}, {3, 5, 6})
вы смотрели на https: // эн. wikipedia.org/wiki/Subset_sum_problem Ваш вопрос является более продвинутой проблемой, которая требует некоторого причудливого динамического программирования, я сомневаюсь, что есть библиотека python, которая может сделать это за вас :( – jcr
Okay спасибо ...... – yzcop
http://stackoverflow.com/questions/6012963/subset-sum-problem; http://stackoverflow.com/questions/23087820/python-subset-sum –