Multi select elements which sums upto a certain number from an array(II)

Give an array and a certain number,how to select some of the elements to sums upto the number? (Also see http://blog.csdn.net/northwolves/archive/2008/11/25/3372338.aspx)
The following codes can bring you solutions out in Column A of Excel worksheet :

Sub Getit() Dim arr(1 To 65536, 1 To 1) As String, n As Long, t As Single Application.ScreenUpdating = False t = Timer Solve 88, Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18), arr, n If n > 0 Then MsgBox "Found " & n & " Solutions! It cost me about " & Format(Timer - t, "0.00000") & " seconds!", , "Info" [a1].Resize(n) = arr [a:a].Sort [a1] Else MsgBox "No solutions was Found!" End If Application.ScreenUpdating = True End Sub Sub Solve(ByVal Sum As Long, ByRef myarray, ByRef Result() As String, Optional ByRef num As Long) Dim n As Long, i As Long, Temp As Long, b() As Long n = UBound(myarray) - LBound(myarray) ReDim b(n + 1) While b(n + 1) < 1 Temp = 0 b(0) = b(0) + 1 For i = LBound(myarray) To UBound(myarray) If b(i) = 2 Then b(i) = 0 b(i + 1) = b(i + 1) + 1 End If If b(i) = 1 Then Temp = Temp + myarray(i) Next If Sum = Temp Then num = num + 1 For i = LBound(myarray) To UBound(myarray) If b(i) = 1 Then Result(num, 1) = Result(num, 1) & " " & myarray(i) Next Result(num, 1) = Replace(Trim(Result(num, 1)), " ", "+") & "=" & Sum End If If Temp >= Sum Then For i = LBound(myarray) To UBound(myarray) If b(i) = 1 Then Exit For b(i) = 1 Next b(1) = 1 End If Wend End Sub

It returns:

1+10+11+12+12+13+14+15=88
1+10+11+15+16+17+18=88
1+10+12+14+16+17+18=88
1+10+12+14+16+17+18=88
1+10+13+14+15+17+18=88
1+11+12+13+16+17+18=88
1+11+12+13+16+17+18=88
1+11+12+14+15+17+18=88
1+11+12+14+15+17+18=88
1+11+13+14+15+16+18=88

......

Total 8528 solutions within about 3 seconds.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值