将每个整数向量相加到给定数字的有效方法

时间:2016-06-10 18:56:08

标签: python combinatorics

你将如何找到长度为n的所有可能的整数向量,它们总和到给定的m。我知道通常有C(m,k)解决这个问题的方法。 例如,对于n = 4和m = 2,我们有以下解决方案:

[[2 0 0 0]
 [1 1 0 0]
 [1 0 1 0]
 [1 0 0 1]
 [0 2 0 0]
 [0 1 1 0]
 [0 1 0 1]
 [0 0 2 0]
 [0 0 1 1]
 [0 0 0 2]]

我已经编写了一个有效的代码,但我认为它远非最佳。 n = 20和m = 5已经花了很长时间。 现在我通过获取n-1的解决方案并在任何地方添加1来递归地执行它,并在添加之前检查解决方案是否已经在列表中。

def outputs(n, m):
    outs = np.empty([math.factorial(m + n - 1)/math.factorial(n)/math.factorial(m-1), m], dtype=int)
    count = 0
    if n == 1:
        for i in range(m):
            temp = np.zeros(m)
            temp[i] = 1
            outs[i] = temp.copy()
        return outs
    output = outputs(n-1, m)
    for otp in output:
        for i in range(m):
            temp = otp.copy()
            temp[i] += 1
            if temp.tolist() not in outs.tolist():
                outs[count] = temp.copy()
                count += 1
    return outs

这个问题可以通过查找总和为给定数m的所有整数组合,然后进行排列来重新制作。但我不确定它会有所帮助。

0 个答案:

没有答案