我想生成一个字典序列的数字,以便每个数字的数字总和是一个给定的常数。它有点类似于“子集和问题”。例如,如果我希望生成 sum = 3 的 4 位数字,那么我有一个类似的系列:
[3 0 0 0]
[2 1 0 0]
[2 0 1 0]
[2 0 0 1]
[1 2 0 0] ... 等等。
我能够使用以下代码在 Python 中成功地做到这一点:
import numpy as np
M = 4 # No. of digits
N = 3 # Target sum
a = np.zeros((1,M), int)
b = np.zeros((1,M), int)
a[0][0] = N
jj = 0
while a[jj][M-1] != N:
ii = M-2
while a[jj][ii] == 0:
ii = ii-1
kk = ii
if kk > 0:
b[0][0:kk-1] = a[jj][0:kk-1]
b[0][kk] = a[jj][kk]-1
b[0][kk+1] = N - sum(b[0][0:kk+1])
b[0][kk+2:] = 0
a = np.concatenate((a,b), axis=0)
jj += 1
for ii in range(0,len(a)):
print a[ii]
print len(a)
我认为这不是一种非常有效的方法(因为我是 Python 新手)。它适用于 M 和 N (<10) 的小值,但除此之外真的很慢。我希望将它用于 M ~ 100 和 N ~ 6。我怎样才能使我的代码更有效率,或者有更好的编码方法吗?