这里我有一个数组,如何判断数组是否可以分为两个子集中两个元素之和相同的子集,如果子集可用,程序应该返回true。
For array = [8, 6, 3, 5], the output should be sub(array) = true
可以将这个数组分成两个总和为8的子集:[8]和[3,5]。
`
答案 0 :(得分:1)
这是一个强力解决方案。它使用文档中Itertools Recipes
的powerset配方生成所有子集。然后使用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})
答案 1 :(得分:0)
我找到了一个解决方案,但它会为更大的输入引发内存错误:(
def subs(l):
if l == []:
return [[]]
x = subs(l[1:])
return x + [[l[0]] + y for y in x]
def sub(arr):
ls=[]
ls=subs(arr)
for i in ls:
if(sum(list(set(arr)-set(i)))==sum(i)):
return True
return False