你将如何找到长度为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的所有整数组合,然后进行排列来重新制作。但我不确定它会有所帮助。