組合數學 二 排列組合

2021-09-17 22:00:18 字數 2055 閱讀 3425

**輸出所有組合

從 m 個數中有序地拿出 n 個數的方案數為

p mn

=m!(

m−n)

!p_m^n=\frac

pmn​=(

m−n)

!m!​

簡單解釋就是: m 個數的全排列個數為 m!m!

m!, 如果拿出 n 個數, 那麼就要去掉多出來的所有排列, 所以就要除以 (m−

n)

!(m-n)!

(m−n)!

從 m 個數中不計順序地拿出 n 個數的方案數為

c mn

=m!n

!(m−

n)

!c_m^n=\frac

cmn​=n

!(m−

n)!m

!​我認為也比較好理解, 在相同 m, n 的條件下, 組合就是不計順序的排列, 所以組合的個數就是排列的個數除以排列的方案, 因此也就是 cmn

=pmn

n!

c_m^n=\frac

cmn​=n

!pmn

​​給定 m 和 n, 輸出乙個長為 m 的陣列的所有排列, 可以用遞迴的方式解決:

遞迴一共有 n 層, 第 i 遞迴會選擇第 i 個位置的輸出, 顯然如果某個位置在之前已經被選過了, 那麼它就不能再被選.

c **如下

#include

#define maxn 100

// 從 m 個數中選出 n 個數來排列

int m, n;

// 用來存放資料

int array[maxn]

;// 用來快取輸出

int buffer[maxn]

;// 用來表示這個位置是否已經被用過

int flag[maxn]

;// 輸出快取中的 n 個數

void

out(

)printf

("\n");

}// 遞迴進行排列, 其中 pos 表示當前要選擇的位置

void

perm

(int pos)

else

// 釋放標記

flag[i]=0

;}}int

main()

perm(0

);}

錯位排列和上面的區別是, 排列的第 i 個數字不能是原本的第 i 個數字.

只需要在上面的**中再加一行**就行了

#include

#define maxm 100

int m, n;

int array[maxm]

;int buffer[maxm]

;int flag[maxm]

;void

perm

(int pos)

printf

("\n");

}else

flag[i]=0

;}}int

main()

perm(0

);}

從 m 個數中選取 n 個數, 假如我們知道 n, 比如 n = 2, 那麼我們可以寫乙個二層 for 迴圈:

for

(int i =

0; i < m; i++

)}

即可輸出所有組合.

因此, 我們可以用遞迴的方式來做到對任意的 n 進行組合:

#include

#define maxm 100

int m, n;

int array[maxm]

;int buffer[maxm]

;void

combo

(int pos,

int from)

printf

("\n");

}else}}

intmain()

combo(0

,0);

}

排列 組合數學

定義 從n個不同的元素中,取出m個不同元素,按照順序排成一列,叫做從n個元素取出m個元素的乙個排列。我們將從n個不同的元素取出m個元素所得到得不同排列數,叫做從n個元素取出m個元素的排列數 記為a n,m 其中n m a n,m n n 1 n m 1 n n m 定義 n個不同元素中取m個不同元素...

8 排列組合

1 2 permutations 3 排列組合 4 輸入abc,輸出所有可能的排列結果 5 輸入 abc 6 輸出 abc 7 acb 8 bac 9 bca 10 cab 11 cba 12 1314 include15 16using namespace std 1718 int c1 0 19...

排列組合(組合數)

儒雅隨和的小趙閒暇時很喜歡古典文學,比如金 金銀角大王和孫悟空。話說悟空一行在西天取經路上遇上了妖怪金角大王 銀角大王,把唐僧 八戒 沙僧 白馬,連行李一道擄去。兩個大王有幾個法寶,其中乙個是個魔葫蘆,妖怪叫誰的名字,誰應一聲,就被吸進葫蘆,兩個時辰化為膿水。孫悟空來鬥妖魔,魔王叫 孫悟空 他應了,...