不重复不定长度组合

本文介绍了一种使用VBA实现对一组数据进行所有可能的组合,并对每种组合进行求和的方法。通过递归的方式实现了组合的生成,最终将结果输出到Excel的Sheet2中。提供的代码示例展示了如何从Sheet1读取原始数据,递归生成组合及求和,以及如何将结果写回Excel。

具体问题:

求下列数据的所有可能组合,不定长。

10110
10220
10330
10440
10550

 大概想了一下,可能的组合情况会是如下:

10110
10220
10330
10440
10110230
10110340
10110450
 
101102103104100

原数的组合个数将以梯度进行下降,直至驱于1

164110_WP6K_2718942.png

代码如下,假设原始据在Sheet1,输出到Sheet2

'=============================
'程序:
'   根据原素产生不重复组合
'   并根据组合进行求和
'=============================
'公共变量
Public arr
Public sTmp$
Public nTmp
Public MaxN
Public iCount
Public iOut
Sub Combine()
Dim t
'初始数据
t = Time
iOut = 0
'获取原始数据
'arr = Get_Array_Data
arr = Sheet1.UsedRange
'数据下限
MaxN = UBound(arr)
'递归产生组合
Combine_Recursion 1, 1, MaxN
MsgBox (Time - t)
End Sub

Sub Combine_Recursion(m, n, k)
'递归出口
If m > MaxN Then Exit Sub
'原素组合
sTmp = sTmp & arr(n, 1)
'数据求和
nTmp = nTmp + arr(n, 2)
'原素组合计数
iCount = iCount + 1
Result_Out sTmp, nTmp, iCount
If n < MaxN Then
    Combine_Recursion m, n + 1, k         '循环本层
Else
    sTmp = ""
    nTmp = 0
    iCount = 0
    Combine_Recursion m + 1, m + 1, k     '循环外层
End If
End Sub
'输出数据
Sub Result_Out(a, b, c)
With Sheet2
    iOut = iOut + 1
    .Cells(iOut, 10) = a
    .Cells(iOut, 11) = b
    .Cells(iOut, 12) = c
End With
End Sub

Function Get_Array_Data()
Dim brr
ReDim brr(1 To 5, 1 To 2)
brr(1, 1) = 101: brr(1, 2) = 10
brr(2, 1) = 102: brr(2, 2) = 20
brr(3, 1) = 103: brr(3, 2) = 30
brr(4, 1) = 104: brr(4, 2) = 40
brr(5, 1) = 105: brr(5, 2) = 50
Get_Array_Data = brr
End Function

最后的输出结果如下:

10110
10110230
10110210360
101102103104100
101102103104105150
10220
10210350
10210310490
102103104105140
10330
10310470
103104105120
10440
10410590
10550

 具体文件可以从下列地址下载

https://pan.baidu.com/s/1hx8TKpHT-espbcSHewb91A

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值