一尘不染

查找具有给定总和的数字列表的所有组合

algorithm

我有一个数字清单,例如

numbers = [1, 2, 3, 7, 7, 9, 10]

如您所见,数字在此列表中可能会出现多次。

我需要获得具有给定总和的这些数字的所有组合,例如10

组合中的项目可能不会重复,但是其中的每个项目numbers都必须唯一对待,这意味着,例如7列表中的两个代表具有相同值的不同项目。

顺序并不重要,因此[1, 9][9, 1]是相同的组合。

组合没有长度限制,[10]与一样有效[1, 2, 7]

如何创建符合以上条件的所有组合的列表?

在这个例子中, [[1,2,7], [1,2,7], [1,9], [3,7], [3,7], [10]]


阅读 245

收藏
2020-07-28

共1个答案

一尘不染

您可以使用itertools遍历每种可能大小的每种组合,并过滤掉总计不等于10的所有内容:

import itertools
numbers = [1, 2, 3, 7, 7, 9, 10]
result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == 10]
print result

结果:

[(1, 2, 7), (1, 2, 7), (1, 9), (3, 7), (3, 7), (10,)]

不幸的是,这有点像O(2 ^ N)的复杂性,因此它不适用于大于20个元素的输入列表。

2020-07-28