如何在Python中有效地获得总和为10或更低的所有组合

想象一下,你试图在某些领域(例如t = 5)分配一些固定资源(例如n = 10).我试图有效地找出如何获得总和为n或更低的所有组合.

例如. 10,0,0,0,0是好的,以及0,0,5,5,0等,而3,3,3,3,3,3显然是错误的.

我到目前为止:

import itertools
t = 5
n = 10
r = [range(n+1)] * t
for x in itertools.product(*r): 
   if sum(x) <= n:          
       print x

然而,这种蛮力方法非常缓慢;肯定有更好的办法?

计时(1000次迭代):

Default (itertools.product)           --- time: 40.90 s
falsetru recursion                    --- time:  3.63 s
Aaron Williams Algorithm (impl, Tony) --- time:  0.37 s

最佳答案 创建自己的递归函数,除非可以得到一个< = 10的总和,否则不会使用元素递归.

def f(r, n, t, acc=[]):
    if t == 0:
        if n >= 0:
            yield acc
        return
    for x in r:
        if x > n:  # <---- do not recurse if sum is larger than `n`
            break
        for lst in f(r, n-x, t-1, acc + [x]):
            yield lst

t = 5
n = 10
for xs in f(range(n+1), n, 5):
    print xs
点赞