组合问题(先提取数字+全组合)

今天在网上看到一个问题:想从A,B,C,D,E字母中选取3个A,B,C;并做出全组合ABC,ACB,BAC,BCA,CBA,CAB。这样的结果会有多少?

想法也是和问题一致:

1.  先从数列中选取所需要的值: A,B,C,D,E中选取A,B,C

    程序Combine_n_?是抽取数值;Combine_n_F表示从前往后  | Combine_n_B表示从后往前

2. 做出所取值A,B,C的全部组合情况;ABC,ACB,BAC,BCA,CBA,CAB

    程序Permute进行全组合

Public out, iOut
Public arr
Public Org
Public num
Public nMax

'Combination of n from M
Sub Combination_x_In_X()
Dim t
Dim i
Dim m
t = Timer

iOut = 0
m = 1
num = 3                 'Combination Number
nMax = 5                'Number of Range
ReDim Org(1 To nMax)       'Identify Data
'Read Data from Worksheet to Array
For i = 1 To nMax
    Org(i) = Sheet1.Cells(1, i).Value
Next i

ReDim arr(1 To num)          'Identify temp array
ReDim out(1 To 100)          'Identify output array

'Combine_n_B nMax, num        'main program
Combine_n_F 1, 1           'main program

'output result
For i = 1 To iOut
    m = m + 1
    Sheet1.Cells(m, 6) = out(i)
Next i
Debug.Print Timer - t
End Sub

'Combine program
'from front to back
'm: range of Numer
'n: current input number
Sub Combine_n_F(m, n)
Dim i, j
For i = m To nMax           'Loop to range
   arr(n) = Org(i)          'data into temp array
   If n < num Then          'recursion: process next postion of data
       Combine_n_F i + 1, n + 1
   Else                    'exit
'        Array_In_Out arr
       Permute arr, 1, num      'program
    End If
Next i
End Sub

'Combine program
'from back to front
'm: range of Numer
'n: current input number
Sub Combine_n_B(m, n)
Dim i, j
For i = m To n Step -1
   arr(n) = Org(i)         'data into temp array
   If n > 1 Then           'recursion: process next postion of data
       Combine_n_B i - 1, n - 1
   Else                    'exit
        Array_In_Out arr
'       Permute arr, 1, num      'program
    End If
Next i
End Sub

'Convert the position
Sub Permute(arr, m, n)
Dim temp
Dim i&
If m = n Then
    Array_In_Out arr    'data into output array
    Exit Sub
Else
    For i = m To n Step 1
    temp = arr(m)     'switch
    arr(m) = arr(i)
    arr(i) = temp
    Permute arr, m + 1, n
    temp = arr(m)     'back
    arr(m) = arr(i)
    arr(i) = temp
    Next i
End If
End Sub

'data into output array
'store as string
Sub Array_In_Out(arr)
Dim i
Dim Str$
For i = 1 To UBound(arr)
    Str = Str & arr(i)
Next i
iOut = iOut + 1
out(iOut) = Str
End Sub

5个字母中抽取3个例子结果:

ABC
ACB
BAC
BCA
CBA
CAB
ABD
ADB
BAD
BDA
DBA
DAB
ABE
AEB
BAE
BEA
EBA
EAB
ACD
ADC
CAD
CDA
DCA
DAC
ACE
AEC
CAE
CEA
ECA
EAC
ADE
AED
DAE
DEA
EDA
EAD
BCD
BDC
CBD
CDB
DCB
DBC
BCE
BEC
CBE
CEB
ECB
EBC
BDE
BED
DBE
DEB
EDB
EBD
CDE
CED
DCE
DEC
EDC
ECD

转载于:https://my.oschina.net/tedzheng/blog/3013481

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值