加減乘除四個原理不再贅述。(即使小學生都會的原理也能出些大學生不會的題目)
1集合的排列(Pertutations of Sets)(無重有序)(無重復有序)
設r為正整數,把n個元素的集合S的一個r排列理解為n個元素中r個元素的有序擺放。其數目用P(n,r)表示
對正整數n和r,r<=n,有P(n,r) = n(n-1)(n-2)......(n-r+1) = n! / (n-r)! (乘法原理證明)
若r>n,P(n,r)=0.並且有P(n,1)=n, P(n,n) = n!,定義P(n,0) = 1.
(在c++STL中,<algorithm>中有按照字典序產生排列的算法next_permutation和prev_permutation,函數返回bool值)
定理:n個元素的循環r排列(圍成一個環)的個數是P(n,r)/r, 即n!/ (r(n-r)!), r= n時有(n-1)!
例如6個人圍成環(固定一人)的方法有5!種。
2集合的組合(Combinations of Sets)(無重無序)
設r非負整數,理解為n中r個元素的無序選擇。其數目記為C(n,r)
C(n,r) = P(n,r) / r! = n! / (r!(n-r)!) 性質:C(n,r)=C(n,n-r)
定理:C(n,0) + C(n,1) + C(n,2) + ...... + C(n,n) = 2^n
3多重集的排列(Permutations of Multisets)(有重有序)(有重只多重集的結合元素是有重復的)
例如S={2.a, 1.b, 3.c}表示2個a,1個b,3個c。
定理1:令S是一個多重集,它有k個不同類型的元素,每一個元素都有無限個,那么S的r排列個數為k^r
定理2:令S是一個多重集,它有k個不同類型的元素,各元素重數分別是n1, n2, n3, ... ,nk。設S的大小n=n1+n2+...+nk,
則S的排列數為n! / (n1!n2!...nk!)
4多重集的集合(Combinations of Multisets)(有重無序)
定理:令S是一個多重集,它有k個不同類型的元素,每一個元素都有無限個,那么S的r排列個數為C(r+k-1,r)
元素有限個時需要用到容斥原理解決。
ps:簡單總結了一下四種排列組合問題,要學好排列組合需要大量的練習,以上沒有給出證明,只是用來做個總結回顧,需要的自己參考一下相關書籍。打字不容易,自學數學傷不起啊。