求组合数,从n个数中拿出m个数,并列出其组合方式:
思想:
利用递归,一个一个的取出来:
例: void combine(int a[],int n,int m,const int M)
对 1 2 3 4 5 从这5个数中取出3个
从后往前,先取出一个数
1 2 3 4 5
从加粗的数字中取出一个相应的数 1 2 3 4 5
假设取5,把它存在一个数组b[]中 b[]:5
然后继续 1 2 3 4 5
假设取 4 1 2 3 4 5 b[]:5 4
然后再取
假设取3 取完三个输出 b[]:5 4 3
然后进行递归,直到完全输出!
来看代码:
int combine(int a[],int n,int m,int c[],const int M) //从n个数中取出m个数,a[]为其原数
{ //c[] 用来储存,方便输出,M为静态变量,其值不变
for(int i=n;i>=m;i--)
{
c[m]=i;
if(m>1)
combine(a,i-1,m-1,c,M);
else//输出
{
for(int j=1;j<=M;j++)
printf("%d",b[j]);
}
}
}
注意for循环,
注意m:m代表for循环的最小值,因为如果小于m其去取的数肯定不够,可以把该函数在n个数中选择m-1个数,直到m==1