Private Sub Command1_Click()
Dim temp, i As Long
temp = Split(getsall(21, 9), vbCrLf) 'add 21 roses to 9 vases
For i = 0 To UBound(temp)
List1.AddItem temp(i)
Next
MsgBox List1.ListCount 'return 3003
End Sub
Function getsall(ByVal sums As Long, ByVal m As Integer) As String ' add sums roses to m vases
Dim a() As String, b() As String, i As Long, j As Long
ReDim a(1 To m)
If sums = m Then
For i = 1 To m
a(i) = "1"
Next
getsall = Join(a, ",")
End If
If sums = m + 2 Then
ReDim b(1 To m)
For i = 1 To m
For j = 1 To m
a(j) = IIf(i = j, "3", "1")
Next
b(i) = Join(a, ",")
Next
getsall = Join(b, vbCrLf)
Erase b
Erase b
End If
If sums > m + 2 And m = 1 Then getsall = m
If sums > m + 2 And m = 2 Then
ReDim a(1 To sums / 2)
For i = 1 To sums Step 2
a((i + 1) / 2) = i & "," & (sums - i)
Next
getsall = Join(a, vbCrLf)
End If
If sums > m + 2 And m > 2 Then
getsall = Replace(getsall(sums - 1, m - 1), vbCrLf, "," & "1" & vbCrLf) & "," & "1"
For i = 3 To sums Step 2
If getsall(sums - i, m - 1) <> "" Then getsall = Replace(getsall(sums - i, m - 1), vbCrLf, "," & i & vbCrLf) & "," & i & vbCrLf & getsall
Next
End If
End Function
这样应该行,我大概写一下,速度也应该可以,呵呵,别笑话
for i1=1 to 39/8+1 '这个1不一定必须哈
for i2=i1 to 39/7+1 step 2
for i3=i2 to 39/6+1 step 2
.........
for i9=i8 to 33 step 2
if i1+...+i9=39 then print i1,.....,i9