我正在尝试编写一个函数,它不仅可以确定集合的子集之和是否等于所需的目标数,而且还可以打印出作为解的子集。
下面是查找子集是否存在的代码:
def subsetsum(array,num):
if num == 0 or num < 1:
return False
elif len(array) == 0:
return False
else:
if array[0] == num:
return True
else:
return subsetsum(array[1:],(num - array[0])) or subsetsum(array[1:],num)
我如何修改这个来记录子集本身,以便我可以打印它?提前感谢!
7条答案
按热度按时间ycl3bljg1#
基于您的解决方案:
nfzehxib2#
进行修改,以便在匹配发生时检测重复项和进一步的解决方案
a0x5cqrl3#
你可以改变你的方法来更容易地做到这一点,比如:
这将返回有效子集或
None
。flmtquvp4#
我想我会再找个解决办法。
我们可以将列表子集的每个选择Map到一个(填充0的)二进制数,其中0表示不取列表中对应位置的成员,1表示取。
因此,使用
0101
屏蔽[1, 2, 3, 4]
将创建子列表[2, 4]
。因此,通过生成0到2^LENGTH_OF_LIST范围内的所有0填充二进制数,我们可以迭代所有选择。如果我们使用这些子列表选择作为掩码,并对选择求和,我们就可以知道答案。
这是怎么做到的:
输出:
为了返回所有可能性,我们可以使用生成器(唯一的变化是在
subset_sum
中,使用yield
代替return
,并删除return False
保护):输出:
我没有使用它,因为它不太明显(对我来说)是怎么回事,这样的trenary类面具(1,0或无),我宁愿有一切很好地定义。
3pvhb19x5#
通过Recursion打印所有子集的方法稍有不同。
bjg7j2ky6#
您可以使用迭代方法,而不是使用递归。
7xllpg7q7#
稍微更新了下面的代码,以返回此问题的所有可能组合。当输入作为子集([4,3,1],4)给定时,上面线程中的代码段不会打印所有可能组合