子集和问题
给定一个整数集,是否存在子集使和为0
例:[-7,-3,2,5,8]中存在[-7,2,5]和为0
暴力解法,求出所有的子集,判断是否为0
子集的个数:因为每一个元素要么出现要么不出现,所有一共有2^n个
先假设A中只有三个元素,元素出现用1表示不出现用0表示
所有子集为[100], [010], [001], [110], [101], [011], [111], [000],每个子集也可用十进制表示
同理,可以 10进制转换为2进制,再找到相对应的子集
代码实现
def subset_sum(lst, target):
for i in range(1, 2**len(lst)):
pick = list(mask(lst, bin(i)[2:]))# 找到所有子集
if sum(pick) == target:
yield pick
def mask(lst, m):
''' 取得lst中对应位置的元素 '''
m = m.zfill(len(lst))# 增加长度,不够补0
res = []
for i in range(len(lst)):
if m[i] != '0':
res.append(lst[i])
return res
# 高级写法
# return map(lambda x: x[0], filter(lambda x: x[1] != '0', zip(lst, m)))
result = subset_sum([1, 2, 3], 5)
for i in result:
print(i)
时间复杂度o(2^n),指数级,当n>1000时,单位为年