意思:从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,其他为0
bool 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);