子集和问题

xiaoxiao2021-02-28  53

子集和问题

给定一个整数集,是否存在子集使和为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时,单位为年

转载请注明原文地址: https://www.6miu.com/read-2620426.html

最新回复(0)