zoukankan      html  css  js  c++  java
  • Multi select elements which sums upto a certain number from an array

    Give an array and a certain number,how to select some of the elements to sums upto the number?
    The following codes can bring you one or more solutions out:
    1. Sub Solve(ByVal Total As DoubleByRef Data, Optional ByVal firstsolution As Boolean = True'Get the first( or all if the 3rd param is false) combintaions which has a sum as Total
    2.     Dim Fit As Boolean, Count As Long, Result() As String, Used() As Byte, n As Long, Temp As Double 'Defines
    3.     n = UBound(Data) 'Count of numbers-1
    4.     ReDim Used(n)
    5.     Do
    6.         Fit = False 'Initialize
    7.         Do
    8.             For i = 0 To n
    9.                 Used(i) = 1 - Used(i) 'Used or Not used.
    10.                 If Used(i) = 1 Then Exit For
    11.             Next
    12.             If i > n Then Exit Do ' Nothing was found
    13.             Temp = 0
    14.             For i = 0 To n
    15.             If Used(i) = 1 Then Temp = Temp + Data(i) 'Get the sum of used data
    16.             Next
    17.             If Abs(Temp - Total) < 0.01 Then 'be same
    18.                 Fit = True 'A solution has been found.
    19.                 Exit Do 'Quit a while.
    20.             End If
    21.         Loop
    22.         If Fit Then 'Return the solution found just now.
    23.             Count = Count + 1 'Solution count
    24.             ReDim Preserve Result(1 To Count) 'Return the solution as an array.
    25.             For i = 0 To n
    26.                 If Used(i) = 1 Then Result(Count) = Result(Count) & "+" & Data(i) 'The expression of the solution.
    27.             Next
    28.             Result(Count) = "Solution" & Count & ":  " & Total & "=" & Mid(Result(Count), 2) 'message of solution
    29.             Debug.Print Result(Count) 'Output to immediate window.
    30.             If firstsolution = True Then MsgBox "1 solution has been found!!!"Exit Sub 'Need the first solution only.
    31.         End If
    32.     Loop While Fit
    33.  MsgBox IIf(Count > 1, Count & " solutions have ", IIf(Count = 0, "No ", 1) & " solution has ") & " been found!!!" 'Three options of the result: 0,1 or many
    34. End Sub
    35. Sub Getit() 'Find combinations of an array which sums up to 1839.1
    36.     Solve 1839.31, Array(466.89, 480.49, 281.06, 13.61, 70.59, 174.86, 313.82, 374.66, 281.5, 48.95, 262.86, 300.33, 248.56, 184.4, 442.91, 378.47, 196.49, 150.7, 162.87, 307.73, 64.97, 132.79, 480.06, 361.54, 240.13)
    37. End Sub

    It returns:

    Solution1:  1839.31=13.61+70.59+174.86+313.82+248.56+442.91+378.47+196.49

    If we change the codes as the following:

    1. Sub Getit() 'Find combinations of an array which sums up to 1839.1 
    2.     Solve 1839.31, Array(466.89, 480.49, 281.06, 13.61, 70.59, 174.86, 313.82, 374.66, 281.5, 48.95, 262.86, 300.33, 248.56, 184.4, 442.91, 378.47, 196.49, 150.7, 162.87, 307.73, 64.97, 132.79, 480.06, 361.54, 240.13),False
    3. End Sub

    We'll get 29 solutions as the following:

    Solution1:    1839.31=13.61+70.59+174.86+313.82+248.56+442.91+378.47+196.49
    Solution2:    1839.31=466.89+281.06+13.61+70.59+281.5+378.47+196.49+150.7
    Solution3:    1839.31=480.49+13.61+70.59+174.86+262.86+378.47+150.7+307.73
    Solution4:    1839.31=281.06+13.61+70.59+174.86+313.82+281.5+48.95+196.49+150.7+307.73
    Solution5:    1839.31=466.89+480.49+48.95+184.4+442.91+150.7+64.97
    Solution6:    1839.31=480.49+13.61+174.86+313.82+281.5+196.49+150.7+162.87+64.97
    Solution7:    1839.31=13.61+374.66+300.33+184.4+442.91+150.7+307.73+64.97
    Solution8:    1839.31=13.61+313.82+48.95+300.33+248.56+378.47+162.87+307.73+64.97
    Solution9:    1839.31=480.49+70.59+281.5+48.95+262.86+248.56+150.7+162.87+132.79
    Solution10:  1839.31=281.06+13.61+70.59+281.5+300.33+184.4+196.49+150.7+162.87+64.97+132.79
    Solution11:  1839.31=281.06+262.86+248.56+378.47+162.87+307.73+64.97+132.79
    Solution12:  1839.31=466.89+70.59+174.86+48.95+262.86+184.4+150.7+480.06
    Solution13:  1839.31=281.06+13.61+70.59+281.5+300.33+196.49+150.7+64.97+480.06
    Solution14:  1839.31=281.06+13.61+174.86+262.86+300.33+248.56+196.49+361.54
    Solution15:  1839.31=281.06+13.61+174.86+313.82+248.56+184.4+196.49+64.97+361.54
    Solution16:  1839.31=70.59+174.86+281.5+48.95+378.47+150.7+307.73+64.97+361.54
    Solution17:  1839.31=13.61+70.59+442.91+162.87+307.73+480.06+361.54
    Solution18:  1839.31=70.59+48.95+300.33+248.56+196.49+132.79+480.06+361.54
    Solution19:  1839.31=466.89+281.06+70.59+174.86+442.91+162.87+240.13
    Solution20:  1839.31=374.66+281.5+248.56+184.4+196.49+150.7+162.87+240.13
    Solution21:  1839.31=281.06+13.61+174.86+374.66+262.86+184.4+307.73+240.13
    Solution22:  1839.31=466.89+70.59+174.86+48.95+262.86+196.49+150.7+162.87+64.97+240.13
    Solution23:  1839.31=281.06+374.66+281.5+378.47+150.7+132.79+240.13
    Solution24:  1839.31=70.59+374.66+48.95+184.4+307.73+132.79+480.06+240.13
    Solution25:  1839.31=281.06+13.61+174.86+48.95+248.56+162.87+307.73+361.54+240.13
    Solution26:  1839.31=480.49+13.61+70.59+174.86+300.33+64.97+132.79+361.54+240.13
    Solution27:  1839.31=13.61+281.5+48.95+262.86+248.56+184.4+64.97+132.79+361.54+240.13
    Solution28:  1839.31=313.82+262.86+300.33+162.87+64.97+132.79+361.54+240.13
    Solution29:  1839.31=281.06+70.59+374.66+150.7+162.87+64.97+132.79+361.54+240.13

  • 相关阅读:
    7月25 SVN 提交报错 | mybatis like | 数据库字段设计 | 打包打小包
    7月24 springboot 打包打小包 | mybatis 逆向工程 | 接口返回数据 | 启动打包注意事项 | springboot redis 引入
    7月20号 添加字段报错 | 密码加密与传输
    7月19 登录失败 错误次数 | 字段类型被修改bug | 日志
    7月14 Enity对象的抽取
    7月13 mybatis调用存储过程
    7月12 导入项目到svn | logback配置日志输出
    7月11 配置数据库自己挖坑 | 代码覆盖率测试 | MockMvc 测试用例
    书架
    试题库问题
  • 原文地址:https://www.cnblogs.com/fengju/p/6336250.html
Copyright © 2011-2022 走看看