
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值不定,所以不知道要循环 几重 ,难住了! 展开
有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值不定,所以不知道要循环 几重 ,难住了! 展开
3个回答
展开全部
在窗体上添加一个按钮
代码如下
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
代码如下
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
展开全部
$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.=",";
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.=",";
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
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
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
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询