VB有难度的问题(数组+排列组合),高手进

问题:有M个元素的数组,取出任意N个元素(N>=1andN<=元素总数)的全组合!要求:function过程,两个参数:(数组,N)N表示要用N个元素参与组合本人菜鸟,请... 问题:
有M个元素的数组,取出任意N个元素(N>=1 and N<=元素总数)的全组合!
要求:function过程,两个参数:(数组,N)N表示要用N个元素参与组合

本人菜鸟,请尽量注释,谢谢

举例:
如数组a=array(a,1,2,f),N=2 时 全部组合如下:
a1
a2
af '注,只组合不排列,af 和 fa 算一个
12
1f
2f

N=3时全部组合:
a12
a1f
a2f
12f

我自己想了一夜,仍然没有解决,感觉要多重循环,但是N值不定,所以不知道要循环 几重 ,难住了!
展开
 我来答
zfcsl
2008-09-09 · TA获得超过203个赞
知道小有建树答主
回答量:254
采纳率:0%
帮助的人:370万
展开全部
在窗体上添加一个按钮

代码如下

Private Sub Command1_Click()
AutoRedraw = True
Dim a
Dim i As Integer, j As Integer
Dim M As Integer, L As Integer
Dim mp() As Integer
Dim s(), sp As Integer
Dim nsp As Double

a = Array("a", "1", "2", "f")
M = 2

'从a中选M个元素组合,注意a是字符串数组,最好要用引号

L = UBound(a)

If M > L + 1 Then
MsgBox "M不能超过" & L + 1
Exit Sub
End If

ReDim mp(M - 1)
nsp = 1
For i = 1 To M
nsp = nsp * (L + 2 - i)
nsp = nsp / (M + 1 - i)
Next
Print "共有" & nsp & "种组合"
ReDim s(CLng(nsp))
For i = 0 To M - 1
mp(i) = i
s(0) = s(0) & a(mp(i))
Next

sp = 1
Do Until arrM(mp, M, L) = False
DoEvents
For i = 0 To M - 1
s(sp) = s(sp) & a(mp(i))
Next
sp = sp + 1
Loop

For i = 0 To sp
Print s(i)
Next

End Sub

Function arrM(mp() As Integer, M As Integer, L As Integer) As Boolean
Dim i As Integer, j As Integer
mp(M - 1) = mp(M - 1) + 1
For i = M - 1 To 0 Step -1
If mp(i) > L - (M - 1) + i Then
If i = 0 Then
arrM = False
Exit Function
End If
mp(i - 1) = mp(i - 1) + 1
For j = i To M - 1
mp(j) = mp(j - 1) + 1
Next
End If
Next
arrM = True
End Function

如有不懂请加QQ 476554861
热一点很搞笑
2008-09-09 · TA获得超过337个赞
知道小有建树答主
回答量:478
采纳率:0%
帮助的人:248万
展开全部
$count_a=count($a);

for($int=0;$int<$count_a;$int++)
{
for($i=$int;$i<$count_a-1;$i++)
{
$temp[]=$a[$int].$a[$i+1];
}
}
print_r($temp);

//55555555555整理一下。找出规律先!!

$temp.=$a[$int].$a[$int+1].$a[$int+2];

$temp.=",";

$temp.=$a[$int].$a[$int+1].$a[$int+3];

$temp.=",";

$temp.=$a[$int].$a[$int+2].$a[$int+3];

$temp.=",";

$temp.=$a[$int+1].$a[$int+2].$a[$int+3];

$temp.=",";
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
历又
2008-09-14 · TA获得超过299个赞
知道小有建树答主
回答量:726
采纳率:100%
帮助的人:463万
展开全部
Private Function Portfolio(w() As Variant, n As Integer) '你要的函数
b = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
For i = 0 To n - 2 '初始数据
temp = temp & w(i)
Next i
c = n - 1
For j = c To UBound(w)
Print temp & w(j): b(n - 1) = j '打印出组合
If j = UBound(w) Then
For k = n - 1 To 1 Step -1
If b(k) <> b(k - 1) + 1 Then '判断是否到达数组末尾
For t = k - 1 To n '位置重新开始确定
If t = k - 1 Then
b(t) = b(t) + 1
Else
b(t) = b(t - 1) + 1
End If
Next t
j = b(n - 1) - 1
temp = ""
For q = 0 To n - 2
temp = temp & w(b(q)) '初始数据
Next q
Exit For
End If
Next k
End If
Next j
End Function

Private Sub Form_Click()
Dim u() As Variant
u = Array("a", "1", "2", "f") '字符串数组,最好要用引号,同时各元素不能有相同的
Portfolio u(), 2
End Sub
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式