ฉันต้องการสร้างชุดคำศัพท์ของตัวเลข โดยที่ผลรวมของตัวเลขแต่ละตัวจะเป็นค่าคงที่ที่กำหนด มันค่อนข้างคล้ายกับ 'ปัญหาผลรวมย่อย' ตัวอย่างเช่น หากฉันต้องการสร้างตัวเลข 4 หลักโดยมีผลรวม = 3 ฉันจะมีชุดดังนี้:
[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 ฉันจะทำให้โค้ดมีประสิทธิภาพมากขึ้นได้อย่างไร หรือมีวิธีที่ดีกว่าในการเขียนโค้ดหรือไม่