0

我想为计算机找到一种有效的方法来处理大量变量(比如 50:x1,...,x50),这些变量执行如下操作:找到所有组合 [x1,x2,x3] 满足:

  1. 0 <= x1 <= x2 <= x3

  2. x1 + x2 + x3 = 100

这是一个查找 sum = 100 的所有组合的示例,但 [1,99] 和 [99,1] 在这里被认为是不同的:

x=[]
for i, j in itertools.product(range(0,101), range(0,101)):
    if i+j==100:
       x.append([i,j])

我想找到一种方法来减少循环次数,并且只提供以下内容:

[0,100], [1,99], [2,98], ...., [50,50]

[51,49] 中没有任何内容。

主要目标是使用 50 个变量 (x_1,...x_50) 执行此操作,总和为 100。

用正常循环不太可能做到这一点

4

2 回答 2

1

对于 3 个形式的变量,i+j+k==100我们需要两个 for 循环,对于 n 个变量,我们需要 n-1 个 for 循环来产生结果

for i in range(0,101):
    for j in range(i,101):
        if(100-j-i>=j):
            print i,j,100-j-i

结果

0 0 100
0 1 99
0 2 98
0 3 97
0 4 96
0 5 95
......
......
32 33 35
32 34 34
33 33 34

编辑 1

或者如果您不想为 n-1 循环编写代码,请使用此递归函数,它会更快,因为我做了一些优化以减少其运行时间

def foo(numberofvariables,sumofvar):
    templist=[0]*(numberofvariables)

    def fun(depthofrecursion,tempsum,sumofvar,var):

        if(depthofrecursion<numberofvariables-1):
            for i in range(var,(sumofvar/(numberofvariables-depthofrecursion)+2)):

                templist[depthofrecursion]=i;
                fun(depthofrecursion+1,tempsum+i,sumofvar,i)
        else:

            if(sumofvar-tempsum>=var):
                templist[numberofvariables-1]=sumofvar-tempsum
                for i in range(0,numberofvariables):
                    print templist[i],

                print 

    fun(0,0,sumofvar,0)

foo(3,100)

这里 n 为 3(变量数)并且 sum 为 100 产生与上面相同的输出

于 2018-02-11T06:12:07.997 回答
1

组合呢??

import random
from itertools import combinations
l = random.sample(range(1, 10000), 100)

alist =[(x1,x2,x3) if  (0 <= x1 <= x2 <= x3 and sum([x1,x2,x3]) == 100) else None for x1,x2,x3 in combinations(sorted(l), 3)]
L = list(filter(None, alist))

输出

[(1, 4, 95),
 (1, 7, 92),
 (1, 10, 89),
 (1, 12, 87),
 (1, 17, 82),
 (1, 18, 81),
 (1, 30, 69),
 (1, 32, 67),
 (1, 34, 65),
 (1, 38, 61),
 (1, 49, 50),
 (2, 3, 95),
 (2, 5, 93),
 (2, 7, 91),
 (2, 10, 88),
 (2, 12, 86),
 (2, 17, 81),
 (2, 18, 80),
 (2, 22, 76),
 (2, 30, 68),
 (2, 33, 65),
 (3, 4, 93),
 (3, 5, 92),
 (3, 7, 90),
 (3, 10, 87),
 (3, 12, 85),
 (3, 17, 80),
于 2018-02-11T06:52:18.820 回答