1. 程式人生 > >求組合數的遞迴實現,即求C(n,m)

求組合數的遞迴實現,即求C(n,m)

此法借鑑了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;
}