Saya ingin membuat rangkaian angka leksikografis sedemikian rupa sehingga untuk setiap angka jumlah digitnya adalah konstanta tertentu. Hal ini agak mirip dengan 'masalah jumlah subset'. Misalnya jika saya ingin menghasilkan angka 4 digit dengan jumlah = 3 maka saya memiliki rangkaian seperti:
[3 0 0 0]
[2 1 0 0]
[2 0 1 0]
[2 0 0 1]
[1 2 0 0] ... dan seterusnya.
Saya berhasil melakukannya dengan Python dengan kode berikut:
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)
Menurut saya ini bukan cara yang efisien (karena saya seorang pemula Python). Ini berfungsi dengan baik untuk nilai M dan N yang kecil (‹10) tetapi sangat lambat setelah itu. Saya ingin menggunakannya untuk M ~ 100 dan N ~ 6. Bagaimana cara membuat kode saya lebih efisien atau adakah cara yang lebih baik untuk mengkodekannya?