如何记忆这个子集和算法?

时间:2016-12-02 15:47:02

标签: python algorithm dynamic-programming

这与此问题不同: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, '' )

我希望通过备忘录来反思这一点。 但是我很难弄清楚这个函数的状态应该是什么(它应该是ntarget?但是我没有看到它被重复)

1 个答案:

答案 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行和总和列的矩阵来解决自下而上的问题,反之亦然。