非递归解决组合问题
来源:互联网 发布:单片机和嵌入式的关系 编辑:程序博客网 时间:2024/06/05 18:16
从m 个互不相同元素中取 n 个元素,一般选用递归或回溯算法解决,本文旨在利用进制转换的方法达到这一目的。代码如下
Sub GETALL(ByVal num As Integer, ByRef x As Variant, ByRef RESULT() As String, Optional ByRef all As Long)
Dim A() As String, b() As Integer '临时数组
Dim n As Integer ' 数组元素个数
Dim i As Long '循环变量
Dim TEMP As Long '二进制转换中间变量
Dim num2 As Integer '中间计数变量
n = UBound(x) - LBound(x) + 1 '数组元素个数
If num > n Then MsgBox "ERR!", vbInformation, "WARNING": Exit Sub
ReDim b(0 To n - 1)
all = 0
For i = 0 To 2 ^ n - 1 '循环
TEMP = i
num2 = 0
For j = 0 To n - 1 '转换为二进制
b(j) = TEMP And 1 '0 or 1
TEMP = TEMP / 2
If b(j) = 1 Then
num2 = num2 + 1
ReDim Preserve A(1 To num2)
A(num2) = x(LBound(x) + j)
End If
Next
If num2 = num Then
all = all + 1
ReDim Preserve RESULT(1 To all)
RESULT(all) = Join(A, ",") '结果保存
Debug.Print RESULT(all) '输出
End If
Next
Debug.Print "从 " & n & " 个元素的数组中选 " & num; " 个元素, 共 " & all & "种组合!"
End Sub
Private Sub Command1_Click()
Dim x, i As Integer
Dim out() As String
x = Array(1, 2, 3, 4, 5, 6, 7, 8)
GETALL 4, x, out
End Sub
输出:
1,2,3,4
1,2,3,5
1,2,4,5
1,3,4,5
2,3,4,5
1,2,3,6
1,2,4,6
1,3,4,6
2,3,4,6
1,2,5,6
1,3,5,6
2,3,5,6
1,4,5,6
2,4,5,6
3,4,5,6
1,2,3,7
1,2,4,7
1,3,4,7
2,3,4,7
1,2,5,7
1,3,5,7
2,3,5,7
1,4,5,7
2,4,5,7
3,4,5,7
1,2,6,7
1,3,6,7
2,3,6,7
1,4,6,7
2,4,6,7
3,4,6,7
1,5,6,7
2,5,6,7
3,5,6,7
4,5,6,7
1,2,3,8
1,2,4,8
1,3,4,8
2,3,4,8
1,2,5,8
1,3,5,8
2,3,5,8
1,4,5,8
2,4,5,8
3,4,5,8
1,2,6,8
1,3,6,8
2,3,6,8
1,4,6,8
2,4,6,8
3,4,6,8
1,5,6,8
2,5,6,8
3,5,6,8
4,5,6,8
1,2,7,8
1,3,7,8
2,3,7,8
1,4,7,8
2,4,7,8
3,4,7,8
1,5,7,8
2,5,7,8
3,5,7,8
4,5,7,8
1,6,7,8
2,6,7,8
3,6,7,8
4,6,7,8
5,6,7,8
从 8 个元素的数组中选 4 个元素, 共 70种组合!
但从运算速度上来说,本方法可能要比递归,回溯慢些。
- 非递归解决组合问题
- 非递归解决组合问题
- 递归与非递归解决组合问题
- 回溯法解决组合与数的问题(递归与非递归算法)
- 【算法】 组合数问题非递归解法
- k组合生成问题-非递归
- 字符串的组合问题 递归和非递归实现
- 组合问题的递归方式解决
- 组合非递归实现
- 组合(非递归)
- 使用非递归算法解决迷宫问题
- 非递归解决斐波纳挈数列问题
- 几个编程问题非递归解决
- 组合输出(非递归)
- 使用递归算法解决字符的组合问题
- 算法——使用递归解决组合问题
- 组合函数递归和非递归实现
- 组合的递归与非递归
- 魔法大锅炉-Eric Raymond
- 开拓智域-Eric Raymond
- Imagee Database
- C++ STL容器的Benchmark[转贴]
- 7月25号签到表
- 非递归解决组合问题
- 使用javadoc规范java开发文档
- 数组的参数必须是 ByRef
- 动态裁剪窗体标题栏
- 这是王为的专栏
- 初识Blog
- 8月1号 首届CSDN.南京区程序员聚会 !请参加本次活动的程序员注意了
- 美国插手收买中国主管航空业的要员??“运十”下马的隐情
- 当钱不在钱包的时候??