加减乘除四个原理不再赘述。(即使小学生都会的原理也能出些大学生不会的题目)
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:简单总结了一下四种排列组合问题,要学好排列组合需要大量的练习,以上没有给出证明,只是用来做个总结回顾,需要的自己参考一下相关书籍。打字不容易,自学数学伤不起啊。