我准备解决一个问题:
39支玫瑰,插在9个花瓶里,条件花瓶里的玫瑰不能有偶数。应该怎么插?
请教一个算法过程

解决方案 »

  1.   

    每瓶先插一支,剩下30支每瓶插入偶数支(包括0)
    所以答案是x1+x2+x3+x4+x5+x6+x7+x8+x9=15的非负数解的个数。
      

  2.   

    这样应该行,我大概写一下,速度也应该可以,呵呵,别笑话
    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
      

  3.   

    也可以用一个do while不过速度一定不如这个快
      

  4.   

    northwolves(野性的呼唤)你说的第二种方法(先插一支....)我很感兴趣,能列出代码供学习吗?
      

  5.   

    flyingscv(zlj) :
    你的那个9重循环print出来的会有0.northwolves(野性的呼唤)说的第二种方法(先插一支....),我还没有想到是何种方式呢。
    可以再说具体些吗?
      

  6.   

    每瓶先插一支,剩下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
      

  7.   

    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