可能与目标值的组合

时间:2019-05-04 05:37:23

标签: python python-3.x

我有一个数字列表:

[4, 2, 6, 18, 5, 3, 15]

我需要找到给我21岁的所有组合。

如何实现?

2 个答案:

答案 0 :(得分:1)

使用itertools.combinations

>>> for i in range(1, len(xs)):
...     for comb in combinations(xs, i):
...         if sum(comb) == 21:
...             print(list(comb))
... 
[6, 15]
[18, 3]
[4, 2, 15]

答案 1 :(得分:0)

如果试图在较大的列表上加快速度,则可以减少计算和使用记忆功能所需的组合数量。这是一种递归方法,将修剪数目大于当前总和的树。它使用lru_cache中的functools来进行记忆,但是如果您希望看到它可以工作的话,用字典来实现它并不难。如果您花了点时间,应该会发现它比搜索所有组合的方法更快地工作:

from functools import lru_cache

@lru_cache()
def findsums(arr, target):
    ret = []
    for i, n in enumerate(arr):
        if n == target:
            ret.append([n])
        elif n < target and i < len(arr) - 1:
            p = findsums(arr[i+1:], target - n)
            ret.extend([n] + arr for arr in p )
    return ret

xs = (4, 2, 6, 18, 5, 3, 15)

findsums(xs, 21)

>> [[4, 2, 15], [6, 15], [18, 3]]