从memoized subset-sum算法中获取组合?

时间:2016-10-19 21:23:57

标签: python algorithm memoization subset-sum

我一直在研究基本的子集和问题。给定一个总和,让我们说6和数字[1,2,3,4,5,6]),我必须找到总计s的组合总数(对于s = 6:[1 ,5],[2,4],[1,2,3])。

我已经能够通过强力避风港来解决这个问题,并且能够找到记忆它的方法,所以我的代码对于足够大的n值是不可行的。

我找到了一个很好用的memoized算法here,但它只给了我组合的数量(因此,对于s = 6,组合的数量是3) - 而不是组合本身。是否有可能记住这个问题(这样我可以为非常大的s值运行它)能够自己输出组合?

1 个答案:

答案 0 :(得分:0)

您可以使用itertools.combinations()简化问题:

>>> from itertools import combinations
>>> s = 6
>>> my_list = range(1, s)
# Value of 'my_list':
# [1, 2, 3, 4, 5]

>>> my_combinations = [combinations(my_list, i) for i in range(2, s)]
# Value of 'my_combinations' (in actual will be containg <combinations> objects):
# [[(1, 2), (1, 3), (1, 4), (1, 5), (2, 3), (2, 4), (2, 5), (3, 4), (3, 5), (4, 5)], [(1, 2, 3), (1, 2, 4), (1, 2, 5), (1, 3, 4), (1, 3, 5), (1, 4, 5), (2, 3, 4), (2, 3, 5), (2, 4, 5), (3, 4, 5)], [(1, 2, 3, 4), (1, 2, 3, 5), (1, 2, 4, 5), (1, 3, 4, 5), (2, 3, 4, 5)], [(1, 2, 3, 4, 5)]]

>>> my_required_set = [my_set for my_sublist in my_combinations for my_set in my_sublist if sum(my_set) == s]
>>> my_required_set
[(1, 5), (2, 4), (1, 2, 3)]