具有相同sum-python的子集

时间:2017-02-16 10:19:28

标签: python python-2.7 python-3.x lambda itertools

这里我有一个数组,如何判断数组是否可以分为两个子集中两个元素之和相同的子集,如果子集可用,程序应该返回true。

For array = [8, 6, 3, 5], the output should be sub(array) = true
  

可以将这个数组分成两个总和为8的子集:[8]和[3,5]。

`

2 个答案:

答案 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