|
前面的帖子《【新手进阶】之二十三:从二进制到组合算法》说过,可以通过二进制来处理组合问题。规划求解说到底,也是一种组合算法。比如,从若干个数中,挑选几个数出来,使得这些数的和为给定的数。
闲话少叙,先上代码:
- Sub getNumbers(ByRef arr() As Variant, ByVal sum As Integer)
- Dim i As Long
- Dim j As Long
- Dim strResult As String
- Dim intCount As Integer
- Dim intSum As Integer
- For i = 1 To 2 ^ UBound(arr)
- intSum = 0
- intCount = 0
- strResult = ""
- For j = LBound(arr) To UBound(arr)
- If i And 2 ^ j Then
- intSum = intSum + arr(j)
- strResult = strResult & " " & arr(j)
- intCount = intCount + 1
- End If
- Next j
- If intCount > 0 And intSum = sum Then
- Debug.Print strResult
- End If
- Next i
- End Sub
- Sub test()
- Dim arr() As Variant
- Dim sum As Integer
- arr = Array(2, 3, 5, 7, 11, 13, 17, 19, 21, 23, 29, 31, 37)
- sum = 100
- Call getNumbers(arr, sum)
- End Sub
复制代码 写法基本没太大差异,唯一区别就是这里用了“逻辑与”(And)来处理二进制情况。
i And 2 ^ j 表示将十进制数据i与2^j进行“与”运算,表示i的二进制j位是否为1。 附件如下:
【新手进阶】之一:If分支语句
【新手进阶】之二:分支语句总结
【新手进阶】之三:循环语句For
【新手进阶】之四:循环语句Do和死循环
【新手进阶】之五:递归算法
【新手进阶】之六:冒泡排序
【新手进阶】之七:从四脚腾空的奔马谈起——原来界面可以这样设计
【新手进阶】之八:公共变量与传址过程、传值过程
【新手进阶】之九:仓库管理系统
【新手进阶】之十:从百钱百鸡谈起——浅谈“规划求解”兼答lingjiang问
【新手进阶】之十一:“庖丁解牛”和“纪昌学射”——浅谈表格式文本数据的导入
【新手进阶】之十二:嵌套与并列——再谈If流程问题
【新手进阶】之十三:记录集的“凌迟”——逐条导出记录集
【新手进阶】之十四:“不明觉厉”——浅谈左侧导航栏的设计
【新手进阶】之十五:浅谈ADO之序言
【新手进阶】之十六:浅谈ADO之Connection
【新手进阶】之十七:浅谈ADO之Conmmand(上)
【新手进阶】之十八:浅谈ADO之Command(下)
【新手进阶】之十九:Outlook风格导航界面
【新手进阶】之二十:浅谈ADO之Recordset(上)
【新手进阶】之二十一:浅谈ADO之Recordset(下)
【新手进阶】之二十二:浅谈不绑定数据源操作记录
【新手进阶】之二十三:从二进制到组合算法
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|