此法借鉴了2009年华为一笔试题我写的一个递归算法
http://blog.csdn.net/challenge_c_plusplus/article/details/6640530
排列数的递归实现见我的另一篇
http://blog.csdn.net/challenge_c_plusplus/article/details/6574788
/*
* 功能:输出组合数C(n,m)
* 日期:2011/7/28
* 作者:milo
* 不足:对于有多个重复数字,会输出重复的组合数,可以通过遍历一个数组链表解决。
*/
#include<stdio.h>
#include<stdlib.h>
int *dst_array,top=0,count=0;//中间数组,存放中间求解过程,count计数所有的组合个数
//打印长度为n的数组元素
static void printA(int *parray,int n)
{
int i;
for(i=0;i<n;i++){
printf("%d ",parray[i]);
}
}
//递归打印组合数
static void print_combine(int *pArray,int n,int m)
{
if(n < m || m==0) return ;//情况一:不符合条件,返回
print_combine(pArray+1,n-1,m);//情况二:不包含当前元素的所有的组合
dst_array[top++]=pArray[0];//情况三:包含当前元素
if(m==1){//情况三-1:截止到当前元素
printA(dst_array,top);
printf("\n");
count++;
top--;
return;
}
print_combine(pArray+1,n-1,m-1);//情况三-2:包含当前元素但尚未截止
top--;//返回前恢复top值
}
int main()
{
int n,m,*parray;//存放数据的数组,及n和m
scanf("%d%d",&n,&m);
parray=(int *)malloc(sizeof(int)*n);
dst_array=(int *)malloc(sizeof(int)*m);
int i;
for(i=0;i<n;i++){//初始化数组
scanf("%d",&parray[i]);
}
print_combine(parray,n,m);//求数组中所有数的组合
printf("=====C(%d,%d)共计:%d个=====",n,m,count);
return 0;
}