遍历组合算法的模块化

  在日常的需求设计中,遍历组合是一个常见的问题。

  例如:现在有N个不同的数。要求在其中找到M个数,使得M个数之和为指定的S,求所有满足条件的组合。

  这是一个很明显的遍历组合的问题。一般采用递推算法,求出满足条件的解。

  这类问题一般都采用一个数组P,来存放解。遍历整个组合空间,来找出解(有可能是所有解、也可能是一个解,根据题目要求来定)

  由于这类问题解法是固定的,故在此把该算法模块化。留待日后查阅用。

  

 

  上图是该算法的算法流程图

  下面贴出该算法的伪代码,用的是VB2005

  Public Sub Traversal()
    Dim P() As Integer, K As Integer, IsGroup As Boolean

    InitData()                        注:初始化数组代码块

    K = P.GetUpperBound(0)

    Do
      If IsMatch()  Then                  注:判别是否满足条件的代码块
        OutputAnswer()                  注:输出解的代码块
      End If

      IsGroup = False

      Do
        Delta(K)                     注:P(K)自增加值的代码块
        Do
          If Overflow(K) Then             注:判断P(K)是否越界的代码块
            K = K - 1
            Exit Do
          Else
            If K < P.GetUpperBound(0) Then
              K = K + 1
              SetP(K)                注:依据条件设置P(K)值的代码块
            Else
              IsGroup = True
              Exit Do
            End If

          End If
        Loop
      Loop Until (K < 0 Or IsGroup = True)

    Loop Until K < 0

    SomeEndCode()                      注:求解结束的代码块

  End Sub

 

  举例说明:有1、4、7、2、5、6、9、8、7、5十个数,求四个数之和为20的所有组合。

  分别阐述各个代码块的实现

  初始化数组代码块:

    Dim N() As Integer={1,4,7,2,5,6,9,8,7,5}

    Redim P(3)

    P(0)=0:P(1)=1:P(2)=2:P(3)=3

  判别是否满足条件的代码块:

    N(P(0))+N(P(1))+N(P(2))+N(P(3))=20

  输出解的代码块:

    Debug.Print N(P(0)) & "," & N(P(1)) & "," & N(P(2)) & "," & N(P(3))

  P(K)自增加值的代码块:

    P(K)=P(K)+1

  判断P(K)是否越界的代码块:

    P(K)>K+6

  依据条件设置P(K)值的代码块:

    P(K)=P(K-1)+1

  求解结束的代码块

    本题没必要设置这段代码

 

  故本题的代码如下:

  Public Sub Traversal()
    Dim P() As Integer, K As Integer, IsGroup As Boolean

    Dim N() As Integer={1,4,7,2,5,6,9,8,7,5}

    Redim P(3)

    P(0)=0:P(1)=1:P(2)=2:P(3)=3

    K = P.GetUpperBound(0)

    Do
      If N(P(0))+N(P(1))+N(P(2))+N(P(3))=20  Then       
        Debug.Print N(P(0)) & "," & N(P(1)) & "," & N(P(2)) & "," & N(P(3))

      End If

      IsGroup = False

      Do
        P(K)=P(K)+1
        Do
          If P(K)>K+6 Then  
            K = K - 1
            Exit Do
          Else
            If K < P.GetUpperBound(0) Then
              K = K + 1
              P(K)=P(K-1)+1
            Else
              IsGroup = True
              Exit Do
            End If

          End If
        Loop
      Loop Until (K < 0 Or IsGroup = True)

    Loop Until K < 0

  End Sub

 

  把这类问题模块化,以后碰到类似的问题。直接修改各个代码块的代码。

  著文以记之。

时间: 2024-10-11 19:19:33

遍历组合算法的模块化的相关文章

遍历组合的实现——VB2005

      在数学的统计分支里,排列与组合是一个很重要的分支.在各种实际应用中,排列与组合也扮演了重要的角色.举例来说,安排人员参加活动可以看作是组合的应用.比方说,现在有十个人,选出其中的五个人参加某项集体活动.由于彼此之间有着脾气性格等因素,所以,不同的人员组合有着不同的工作效率.现在,要求你找出效率最高的人员安排.因为选出五人参加活动,没有顺序问题,因此是一个组合的问题.如果说,随机的选出一个组合,用计算机来实现是非常简单的,常见的"洗牌算法"就能实现.要找出效率最高的组合,只要

组合算法的PHP解答方法_php技巧

题目:组合算法:有一个数组a,有N 个元素,现在要求从中找出含有任意元素的所有组合个数. 解答:先看规律吧: 假设这个数组为array(1,2,3,4,5)那么M=5: 可能出现的组合为: 1个数字的组合个数: 5 2个数字的组合个数: 4+3+2+1 3个数字的组合个数: 3+2+1 4个数字的组合个数: 2+1 5个数字的组合个数: 1 很眼熟吧,就是一个逆序的9*9乘法表.除过第一行有M个组合外,其他的组合按乘法表来处理,2个FOR语句嵌套而已 代码: 复制代码 代码如下: $c = 5;

排列组合算法

    排列:从n个不同元素中,任取m(m<=n)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列:从n个不同元素中取出m(m<=n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号A(n,m)表示. A(n,m)=n(n-1)(n-2)--(n-m+1)= n!/(n-m)! 此外规定0!=1     组合:从n个不同元素中,任取m(m<=n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合:从n个不同元素中取出m(m<=

退火算法-java最优组合算法问题,编程实现字母最优组合生成最优解

问题描述 java最优组合算法问题,编程实现字母最优组合生成最优解 要求:输入A~K中的任意几个字母(无重复),对这些字母进行组合.输出最优组合的最小组数n和组合方案,使用java语言. 约束条件:A可以和B一组: A可以和E.F.G一组: C.D.H要单独分组: I可以和E.F.G一组: J可以和E.F.G一组: K可以和E.F.G一组: 如果可以,希望用退火算法的思想来解决本问题.毕设赶着要用这个算法,希望尽快提供解决方案,拜谢! 解决方案 两两组合,还是可以多个组合? 解决方案二: 必须是

Java实现全排列、组合算法

全排列 解法一: 输入一串字符,然后对字符进行全排列,如"abc",全排列结果为:"abc","acb","bac","bca","cab","cba". 分析:从字符串中选择一个作为第一个字符,然后对剩下的字符串进行全排列,如此递归下去,直到打印出全部排列.如:"abc": 1.选a作为第一个字符:"abc","ac

谁有高效的从m个数里面取n个数的组合算法

问题描述 谁有高效的从m个数里面取n个数的组合算法 解决方案 解决方案二: 求全排列?解决方案三: m*(m-1)*(m-2)*...*(m-n+1)所有的解决方案四: 最容易理解的就是递归,但是其效率,实在不能使用.

算法之排列算法与组合算法详解_C 语言

1. 前言 本文介绍了常用的排列组合算法,包括全排列算法,全组合算法,m个数选n个组合算法等. 2. 排列算法 常见的排列算法有: (A)字典序法 (B)递增进位制数法 (C)递减进位制数法 (D)邻位对换法 (E)递归法 介绍常用的两种: (1) 字典序法 对给定的字符集中的字符规定了一个先后关系,在此基础上按照顺序依次产生每个排列. [例]字符集{1,2,3},较小的数字较先,这样按字典序生成的全排列是:123,132,213,231,312,321. 生成给定全排列的下一个排列 所谓一个的

字符串的组合算法问题的C语言实现攻略_C 语言

基本字符串组合问题 题目:输入一个字符串,输出该字符串中字符的所有组合.举个例子,如果输入abc,它的组合有a.b.c.ab.ac.bc.abc. 上面我们详细讨论了如何用递归的思路求字符串的排列.同样,本题也可以用递归的思路来求字符串的组合. 假设我们想在长度为n的字符串中求m个字符的组合.我们先从头扫描字符串的第一个字符.针对第一个字符,我们有两种选择:第一是把这个字符放到组合中去,接下来我们需要在剩下的n-1个字符中选取m-1个字符:第二是不把这个字符放到组合中去,接下来我们需要在剩下的n

asp.net C# 实现任意List的全组合算法代码

 代码如下 复制代码 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 算法 {     class 全组合算法     {         [Flags]         public enum PersonType         {             Audit = 1,             Child = 2,             S