c語言實現排列組合

來源:互聯網
上載者:User

標籤:log   font   char   sum   blog   變數   height   img   組合   

1.求排列組合結果總數

    組合:採用遞迴演算法,根據下面第二行公式。

     

int sumzuhe(int N, int K){    if (K == 0)        return 1;    if (N == K)        return 1;    return sumzuhe(N - 1, K - 1) + sumzuhe(N - 1, K);}

    排列:採用遞迴。思想來自:73863086。

int sumpailie(int N,int K){    if (K ==1)        return N;    return  sumpailie(N - 1, K - 1)*N;}

2.展示排列,組合結果。

    排列:首先從(N)個中取一個數,再在剩餘的一次次取一個數,每取一個數就把這位標記為取過了,以免下次再取。取夠K個數之後,把K個數輸出,展示結果(所以需要提前有一個數組來存                 放結果)。然後再取尋找別的第K個數,依次在不斷尋找別的第(K-1),(K-2),,,,,個數。取完一個數把標記位設為未取過。

void  pailie(int a[],int N,int K,int level)//(K==N)時為全排列{    if (level>=K)    {         for (int j = 0; j < level; j++)            printf("%d ", result[j]);        printf("\n");        return;    }    for (int i = 0; i < N; i++)    {        if (flag[i] == false)//該位未取過        {            flag[i] = true;            result[level++] = a[i];//取出修改標記位            pailie(a, N, K , level);//在未被使用過的裡面再選擇一個            level--;//重新取別的位            flag[i] = false;        }    }}

 

       組合:組合與排列不同的是:不分順序。我們可以假設一直是從前往後選數,那麼前面作為開頭的數,後面就不可以再作為開頭。比如:A,B,C,D。當我第一次選擇第一個數為A的話,把以A為頭的數選完之後,下一次選第一個數決不能是A。所以需要有一個變數來控制所選擇的第一個數(下面的程式為Index)。然後再在第一個數(比如選擇A)之後的數中挑選接下來的數。選擇接下來的數與上面排列類似。

void  zuhe(int a[], int N, int K,int index,int deep){    if (deep >= K)    {        for (int i = 0; i < K; i++)        {            printf("%d ", result[i]);        }        printf("\n");        return;    }    for (int i = index; i <N; i++)    {        result[deep] = a[i];        deep++;        zuhe(a, N, K, index + 1, deep);        deep--;        index++;    }}

完整程式:

#include "stdio.h"#define Max  10#define length 10typedef enum bool{ true,false}bool;char flag[10] ;int  result[10];int sumzuhe(int N, int K){if (K == 0)return 1;if (N == K)return 1;return sumzuhe(N - 1, K - 1) + sumzuhe(N - 1, K);}void  pailie(int a[],int N,int K,int level){     if (level>=K)        { for (int j = 0; j < level; j++)printf("%d ", result[j]);printf("\n");return;}for (int i = 0; i < N; i++){if (flag[i] == false){flag[i] = true;result[level++] = a[i];pailie(a, N, K , level);//在未被使用過的裡面再選擇一個level--;flag[i] = false;}}}void  zuhe(int a[], int N, int K,int index,int deep){if (deep >= K){for (int i = 0; i < K; i++){printf("%d ", result[i]);}printf("\n");return;}for (int i = index; i <N; i++){result[deep] = a[i];deep++;zuhe(a, N, K, index + 1, deep);deep--;index++;}}int sumpailie(int N,int K){if (K ==1)return N;return sumpailie(N - 1, K - 1)*N;}void main(){int a[5] = { 1,2,3,4,5};memset(flag, false, sizeof(flag));printf("排列結果數(5,3):\n");printf("%d ", sumpailie(5, 3));printf("\n");printf("排列結果(5,3):\n");pailie(a, 5, 3, 0);printf("全排列結果:\n");pailie(a, 5, 5, 0);printf("組合結果數(5,3):\n");printf("%d ", sumzuhe(5, 3));printf("\n");printf("組合結果(5,3):\n");zuhe(a, 5, 3, 0, 0);printf("\n");}

  

 

c語言實現排列組合

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.