一 递归求组合数
设函数为void comb(int m,int k)为找出从自然数1、2、... 、m中任取k个数的所有组合。
分析:当组合的第一个数字选定时,其后的数字是从余下的m-1个数中取k-1数的组合。这就将求m个数中取k个数的组合问题转化成求m-1个数中取k-1个数的组合问题。
设函数引入工作数组a[ ]存放求出的组合的数字,约定函数将确定的k个数字组合的第一个数字放在a[k]中,当一个组合求出后,才将a[ ]中的一个组合输出。第一个数可以是m、m-1、
...、k,函数将确定组合的第一个数字放入数组后,有两种可能的选择,因还未确定组合的其余元素,继续递归去确定;或因已确定了组合的全部元素,输出这个组合。
求组合数C(m,k);并分别打印出来
/* 组合数 */ #if 0 #define N 100 int a[N]; int count=0; //求组合数C(m,k)个数,k>=1 int comb1(int m,int k)//(C(m,k)) { int i; for (i=m;i>=k;i--) { if (k>1) { comb1(i-1,k-1); } else { count++; //cout<<m<<":"<<i<<","; } } return count; } //求组合数C(m,k)个数并分别从大到小遍历 int comb2(int m,int k)//(C(m,k)) { int i,j; for (i=m;i>=k;i--) { a[k]=i; if (k>1) { comb2(i-1,k-1); } else { count++; for (j=a[0];j>0;j--) { cout<<a[j]; } cout<<","; } } return count; } int main() { int m,k; cin>>m>>k; a[0]=k; int num=comb2(m,k); cout<<endl; cout<<num<<endl; return 0; } #endif