从N个元素挑出M个组合的算法

1. 将i 从0到(2的N平方-1)递增,依次寻找i的二进制中1的个数,如果为m,则进行后续操作。

2. 递归调用函数:

    这个是示例代码(待补充):

#include<iostream>
using namespace std;

const int MAX=10;
int g[MAX],N,M;

void zuhe(int n,int m)
{
    for (int i=n;i>=1;i--)
    {
        g[m]=i;

        if (m>1)
        {
            zuhe(i-1,m-1);
        }
        else
        {
            // output
            for(int j=1;j<=M;j++)
            {
                cout<<g[j];
            }
            printf("\n");
        }
    }
}

int main()
{
    N=5,M=3;
    zuhe(N,M);
    return 0;
}

 3.还有一种非递归算法:源文件在:http://www.360doc.com/content/10/1102/16/4095212_66011065.shtml;

思想为:

求n个数中的m个数的组合。

首先,初始化一个n个元素的数组(全部由0,1组成),将前m个初始化为1,后面的为0。1对应为选中的元素。

算法开始:从前往后找,找到第一个10组合,将其反转成01,然后将其前面的所有1,全部往左边推,即保证其前面的1都在最左边。然后就可以按照这个01序列来输出一个组合结果了。

而如果找不到10组合,就表示说所有情况都输出了,为什么?你想,(以n=5,m=3为例)一开始是11100,最后就是00111,已经没有10组合了。

这种将问题转换为01序列(也就是真假序列)的想法值得我们考虑和借鉴。

 

    #include <stdio.h>  
    #include <stdlib.h>  
    #include <string.h>  
      
    int l=0;  
      
    //function definition  
    void composition(const char [],int,int);   
    void printCompostion(const char[],const bool[],int);  
      
    //function implementation  
    void printCompostion(const char source[],const bool comp[],int n){  
        int i;  
        for (i=0;i<n;i++)   
            if (comp[i]==true) printf ("%c-",source[i]);  
        printf ("\n");  
      
    }  
      
    void compostion(const char* source,int n,int m){  
          
        bool * comp = (bool*)malloc(n*sizeof(bool));  
          
        int i;  
        for (i=0;i<m;i++) comp[i]=true;  
        for (i=m;i<n;i++) comp[i]=false;  
      
        printCompostion(source,comp,n);  
        l++;  
      
        while(true){  
              
            for (i=0;i<n-1;i++)   
                if (comp[i]==true&&comp[i+1]==false) break;  
              
            if (i==n-1) return;  //all the compostion is found out  
              
            comp[i]=false;  
            comp[i+1]=true;  
              
            int p=0;  
            while (p<i){  
                while (comp[p]==true) p++;  
                while (comp[i]==false) i--;  
                if (p<i) {  
                    comp[p]=true;  
                    comp[i]=false;  
                }  
            }  
            printCompostion(source,comp,n);  
            l++;  
        }  
    }  
      
      
    //test function  
    void testCompostion(){  
          
        char* testcase = "abcdefghijklmno";  
        int n=strlen(testcase);  
        int m=7;  
        compostion(testcase,n,m);  
    }  
      
    //main function  
    void main(){  
        testCompostion();  
        printf ("total=%d\n",l);  
    }  
View Code

 

 

 

posted @ 2013-06-10 21:23  10,000 hours coder  阅读(1337)  评论(0编辑  收藏  举报