遞歸法求組合數C(m,n)


假設這樣一個數組:

1  2  3  4  5

n=5

若 m=3 也就是要求C(3,5)

首先先選第一個數 1

那么剩下的工作就是在2-5之間選擇2個數

如果我們沒有選擇第一個數 選第二個數2

那么剩下的工作就是在3-5之間選擇2個數

這樣就很好遞歸了 只需要記錄下當前已經選了幾個數 當前選的最后一個數是什么 遞歸即可

#include<bits/stdc++.h>

using namespace std;

int sum=0; //記錄總數

void digui(int *a,int *b,int t,int now,int n,int m)
{
    int i;
    if(t==m)   //t記錄已經選擇了幾個數 若=m,輸出結果
    {
        for(i=0;i<m;i++)
        cout<<b[i]<<" ";
        cout<<endl;
        sum++;
        return;
    }
    else
    {
        for(i=now;i<=n-(m-t);i++)  //now代表現在可以從哪個數選起
        {
            b[t]=a[i];
            digui(a,b,t+1,i+1,n,m);
        }
    }
}


int main()
{
    int a[10],b[10],i,n,m;   //a為原數組 b存儲結果 
    cin>>n>>m;
    for(i=0;i<n;i++)
    cin>>a[i];
    digui(a,b,0,0,n,m);
    cout<<sum<<endl;
} 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM