这与此问题不同:find all subsets that sum to a particular value
因为我不需要count
子集的总数,而是存储所有子集并将其返回。
我编写了一个简单的(指数)算法,可以找到总结到特定目标的子集:
Eg:
arr = [1,2,3,4,5,6,7,8]
Possible subsets:
5
4,1
3,2
这是我的算法
n - >列表索引(从结尾开始)
目标 - >我要创建的子集的总和
arr = [1,2,3,4,5,6,7,8]
def subset_sum(arr, n, target, result):
if target == 0:
print result
return
if target < 0 or n < 0:
return False
subset_sum(arr, n-1, target - arr[n], result + str(arr[n]))
subset_sum(arr, n - 1, target, result)
print subset_sum(arr, len(arr) - 1, 5, '' )
我希望通过备忘录来反思这一点。
但是我很难弄清楚这个函数的状态应该是什么(它应该是n
和target
?但是我没有看到它被重复)
答案 0 :(得分:1)
“我不认为它会被重复。”
考虑一个具有重复值或零的数组的简单示例。
例如arr = [3,2,4,5,0,5],你正在寻找总和为7的子集,看这里索引3(如果起始索引为1),结果为2两次,一次当答案被排除在外时,最后5个被包括在答案中 为了更清楚,请在此处查看另一个示例
arr = [5,2,3,6,3,5,8],你正在寻找总和12,你选择最后一个指数即7,然后离开6,5因此达到指数4和4,或者你留下指数7然后选择指数6,5并再次达到指数4和4。
所以这里需要记忆。
你也可以通过构建一个包含n行和总和列的矩阵来解决自下而上的问题,反之亦然。