排列組合實現

2021-10-05 06:41:16 字數 939 閱讀 2338

思想:

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

void  pailie(int a,int n,int k,int level)//(k==n)時為全排列

for (int i = 0; i < n; i++)

}}

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

void zuhe(int a, int n, int k,int index,int deep)

printf("\n");

return;

}for (int i = index; i 程式如下:

#include #include int array[10];//判別是否取過

int result[10];//存結果

int sumpailie(int n,int k)//排列數

int sumzuhe(int n, int k)//組合數

void pailie(int a,int n,int k,int level)

{ //(k==n)時為全排列 level記錄取了多少個數

int i,j;

if(level>=k)//取夠了就輸出

{for(j=0;j=k)

{for(j=0;j

排列組合實現

演算法 與網際網路 組合演算法 本程式的思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標 代表的數被選中,為0則沒選中。首先初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。然後從左到右掃瞄陣列元素值的 10 組合,找到第乙個 10 組合後將其變為 01 組合,同時將其左邊的...

實現排列組合

排列組合是組合數學的基礎,從n個不同元素中任務m個,約定1從n個不同元素中任取m個 約定1計算a n,m 與c n,m 只要簡單進行乘運算即可,要具體展現出排列的每一列與組合的每一組,絕非輕而易舉。我們應用遞迴設計來具體實現排列與組合。def p n,m,k,a global s if k m fo...

遞迴實現排列組合

置換 給定n大於等於1個元素的集合,列印這個集合所有可能的置換。我們通過觀察集合,得到生成所有置換的簡單演算法,以下是演算法的構造過程 1 a跟在 b,c,d 的所有置換之後。2 b跟在 a,c,d 的所有置換之後。3 c跟在 a,b,d 的所有置換之後。4 d跟在 a,b,c 的所有置換之後。in...