从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序列(也就是真假序列)的想法值得我们考虑和借鉴。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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); }