算法问题

wea1978 2003-12-26 09:29:50
我准备解决一个问题:
39支玫瑰,插在9个花瓶里,条件花瓶里的玫瑰不能有偶数。应该怎么插?
请教一个算法过程
...全文
20 点赞 收藏 21
写回复
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
northwolves 2003-12-28
9个奇数的和也是奇数,不可能36

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



回复
Huaraco 2003-12-28
用递归试试。
回复
wea1978 2003-12-28
9个奇数的和不可能是36?
是……但是有没有其它可能的结果呢?现在就想知道这个结果

递归?
不解……
可以写来学习学习吗?
回复
chillr 2003-12-27
northwolves(野性的呼唤)你说的第二种方法(先插一支....)我很感兴趣,能列出代码供学习吗?
回复
flyingscv 2003-12-27
也可以用一个do while不过速度一定不如这个快
回复
flyingscv 2003-12-27
这样应该行,我大概写一下,速度也应该可以,呵呵,别笑话
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
回复
northwolves 2003-12-27
递归可以解决,写不出来明天我可以帮你写。
回复
wea1978 2003-12-27
flyingscv(zlj) :
你的那个9重循环print出来的会有0.

northwolves(野性的呼唤)说的第二种方法(先插一支....),我还没有想到是何种方式呢。
可以再说具体些吗?
回复
flyingscv 2003-12-27
啊,我的怎么会出来0?
回复
northwolves 2003-12-27
每瓶先插一支,剩下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
回复
northwolves 2003-12-27
9个奇数的和不可能是36,呵呵
回复
wea1978 2003-12-27
哦,不好意思,是玫瑰只有36支,不是花瓶 ^_^
回复
wea1978 2003-12-27
哈哈……
要是花瓶只有36个呢。怎么放到9个花瓶里?条件同样是不能有偶数哟……
回复
zyh_jason 2003-12-27
先在每个花瓶中放入一支
剩下30支分成15对
变为一道高中数学题:
15只同样小球放入9只同样的盒子,有_____种方法。(不会做自己翻书去)
回复
northwolves 2003-12-26
呵呵,490314 种插法。
回复
jornet 2003-12-26
利用计算机的强大计算能力,求出39种玫瑰分成9堆的所有组合,再判断如果哪个组合有偶数,则排除。
求出39种玫瑰分成9堆的所有组合:简单实现可以用9重循环,其他的方法还一时想不到:)
回复
northwolves 2003-12-26
每瓶先插一支,剩下30支每瓶插入偶数支(包括0)
所以答案是x1+x2+x3+x4+x5+x6+x7+x8+x9=15的非负数解的个数。
回复
Ringfo 2003-12-26
39支不是很多,穷举,呵
回复
northwolves 2003-12-26
不好意思,错了
回复
northwolves 2003-12-26
01001001001001001001001001001001001001001......00100

如上,将19个1插入39个0的如上位置,因共需分成九部分,故需选择8个位置,共有C(19,8)=51272种插法。可以递归解决。
回复
发动态
发帖子
VB基础类
创建于2007-09-28

7451

社区成员

VB 基础类
申请成为版主
社区公告
暂无公告