这样应该行,我大概写一下,速度也应该可以,呵呵,别笑话 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 next i9,i8,...i1
每瓶先插一支,剩下30支每瓶插入偶数支(包括0) 所以答案是x1+x2+x3+x4+x5+x6+x7+x8+x9=15的非负数解的个数,等价于x1+x2+x3+x4+x5+x6+x7+x8+x9=24 的正整数解的个数,即将24个一字排开的1分成九部分,故共有C(23,8)种方法。求出x1+x2+x3+x4+x5+x6+x7+x8+x9=24 每个解,最后的插法:i=1 to 9 a(i)=2*(xi-1)+1
9个奇数的和也是奇数,不可能36Private 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 SubFunction 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 IfIf 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
所以答案是x1+x2+x3+x4+x5+x6+x7+x8+x9=15的非负数解的个数。
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 next i9,i8,...i1
你的那个9重循环print出来的会有0.northwolves(野性的呼唤)说的第二种方法(先插一支....),我还没有想到是何种方式呢。
可以再说具体些吗?
所以答案是x1+x2+x3+x4+x5+x6+x7+x8+x9=15的非负数解的个数,等价于x1+x2+x3+x4+x5+x6+x7+x8+x9=24 的正整数解的个数,即将24个一字排开的1分成九部分,故共有C(23,8)种方法。求出x1+x2+x3+x4+x5+x6+x7+x8+x9=24 每个解,最后的插法:i=1 to 9
a(i)=2*(xi-1)+1
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 SubFunction 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 IfIf 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