非递归解决组合问题

原创 2004年07月25日 09:29:00

从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种组合!


但从运算速度上来说,本方法可能要比递归,回溯慢些。

[组合数学]关于一类棋盘的完美覆盖问题

这篇文章主要讲不规则和规则棋盘能否被1*2骨牌完美覆盖的问题 今天学了一点新的姿势,本人蒟蒻,神犇们看完不要D我先来看一个经典的问题:8*8的棋盘是否能被1*2的骨牌覆盖? 答案是肯定的,我们只要随便...
  • qq_15412011
  • qq_15412011
  • 2017年04月09日 22:34
  • 334

回溯法解决排列组合问题

package 算法和数据结构; /** * Filename : Backtracking.java * Author : zhihao_tian@126.com * Creation time :...
  • sdu_bupt
  • sdu_bupt
  • 2017年05月09日 23:18
  • 331

组合博弈理论

博弈论(一):Nim游戏 博弈论(二):Sprague-Grundy函数 Game theory初步 寻找必败态——一类博弈问题的快速解法 博弈论(一):Nim游戏 重点结论:对于一...
  • Ginray
  • Ginray
  • 2016年01月23日 16:37
  • 892

组合问题的一般C++解法

很多问题都可以归结为组合问题:即C(n,m)---从n个元素中取m个,保存所有组合情况。 组合问题与排列问题不应该混为一谈,排列需要考虑所取元素的放置顺序,而组合问题则不考虑。 STL中提供的ne...
  • hechao3225
  • hechao3225
  • 2017年02月19日 16:02
  • 538

钱币组合方式

假设我们有无限多的1元,2元,5元,10元,20元,50元,100元,200元的钱币,那么为了组合成一个200元的钱币,共有多少种组合方式? 比如说: 200 = 1×100+1×50+2×2...
  • qq_24871519
  • qq_24871519
  • 2016年11月21日 16:28
  • 527

硬币组合问题-动态规划

如果我们有面值为1元、3元和5元的硬币若干枚,如何用最少的硬币凑够11元? (表面上这道题可以用贪心算法,但贪心算法无法保证可以求出解,比如1元换成2元的时候) 首先我们思考一个问题,如何用最少...
  • u014713819
  • u014713819
  • 2014年07月02日 10:25
  • 1537

穷举法解决组合问题

/* *Copyright (c)2016,烟台大学计算机与控制工程学院 *All rights reserved. *文件名称:main.cpp *作 者:胡庆龙 *完成日...
  • huqinglongdeboke
  • huqinglongdeboke
  • 2016年03月17日 08:56
  • 323

穷举法解决组合问题

参考博文:穷举法解决组合问题 看了博文,对我自己的
  • ZYTTAE
  • ZYTTAE
  • 2014年11月24日 14:59
  • 478

组合数学--错排问题

错排问题,在IT面试笔试中都经常
  • sxh850297968
  • sxh850297968
  • 2014年10月11日 15:53
  • 977

硬币面值组合的算法题解

方法一 转自http://www.cnblogs.com/python27/archive/2013/09/05/3303721.html 动态规划的方法,是将m*n(m表示硬币的种类,n表示所要组...
  • styyzxjq2009
  • styyzxjq2009
  • 2014年07月16日 16:59
  • 3776
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:非递归解决组合问题
举报原因:
原因补充:

(最多只允许输入30个字)