组合数

来源:互联网 发布:linux流量统计分析 编辑:程序博客网 时间:2024/05/21 20:28

意思:m个不同元素中取出n(n≤m)个元素的所有组合,叫做从m个不同元素中取出n个元素的组合数。


例子:6个取3个

654 653 652 651 643 642 641 632 631 621

543 542 541 532 531 521

432 431 421

321


程序原理:设两个数组a[m],b[m],a[m]中保存m个数值,b[m]全部初始化为0(代表未选择),在b[m]中设n个值为1(代表选择),每一次改变b数组值记录一下b数组,保存到c[C][m]二维数组中,最后将c二维数组中的值参照a数组转换即可。(C为组合,详见:排列组合)

数组样例:

111000

110100

101100

011100

110010

101010

011010

100110

010110

001110

110001

...

000111


规律:第三位1先向后移一位,第二个1移一位,第一个1跟着,三位1相邻,前两位1回到最前方,第三位1向后移一位,第一二1位相邻,第一位1回到最前方,第二位1向后移一位,以此类推,直到000111为止。

核心代码:

     int a[6],b[6];int c[20][6];int q=0;//c[q][],增加c数组用for(int i=0;i<m;i++){a[i]=i+1;b[i]=0;}//a[i]保存m个数值123456,b[i]初始化为0 for(int i=0;i<n;i++){b[i]=1;}//在b[m]中设n个值为1,其他为0bool judge=false;//do循环用do{int w=0;//c[][w],增加c数组用//参照打印for(int i=0;i<m;i++){if(b[i]==1){c[q][w]=a[i];w++;}}//q++;judge=false;// 核心算法 for(int i=0;i<m-1;i++){if(b[i]==1 && b[i+1]==0){swap(b[i],b[i+1]);//调用封装交换函数judge=true;if(b[0]==0){for(int j=0,k=0;j<i;j++){if(b[j]){swap(b[k],b[j]);k++;}}}break;}}//}while(judge);