一、无重复元素的排列组合定义
排列,英文名为Permutation,是指从某元素集合中取出指定个数的元素进行排序
组合,英文名为Combination,是指从某元素集合中仅仅取出指定个数的元素,不考虑排序
从有n个不同元素的集合任取r个元素的排列方式有:
从有n个不同元素的集合任取r个元素的组合方式有:
二、多重集合(multiset)的排列组合
设多重集合
即集合 S 中含有n1个元素a1, n2个元素a2,…,nk个元素ak,ni被称为元素ai的重数,k成为多重集合的类别数
在 S 中任选 r 个元素的排列称为S的r排列,当r = n时,有公式
在 S 中任选 r 个元素的组合称为S的r组合,当r<=任意ni时,有公式
由公式可以看出多重集合的组合只与类别数k 和选取的元素r 有关,与总数无关!
三、多重集合问题的转化例子
例1:线性方程 x1 + x2 + … + xk = r 一共有多少组非负整数解?
解答:上述不定方程的非负整数解对应于下述排列
1…101…1 01…1 0 … 01…1
x1 个 x2 个 x3 个 … xk 个
其中 k-1个 0 将 r 个 1 分成k段, 每段含1的个数分别为 x1, x2, …, xk,
很明显这个排列是多重集合 S = { r * 1, (k-1)* 0 }的全排列
即:P(r+k-1; r*1, (k-1)*0) = (r+k-1)! / ( r! * (k-1)! ) = C( r+k-1, r),即从k类元素中选r个的种类
例二:某车站有6个入口处,每个入口处每次只能进一个人, 一组9个人进站的方案有多少?
解答:进站方案可以表示为
1 011 011 01 011 01
g1 g2 g3 g4 g5 g6
其中 1 表示不同的人, 而 0 表示门框, 6-1= 5个门框将序列分为六段,
则任意进站方案可表示成上面 14 个元素 S = { 5 * 1, 1 * p1, 1 * p2, …, 1 * p9 }的一个排列
即:P(5+9;51, 1p1, 1p2, …, 1p9) = 14! / ( 5! * 1! * … 1! ) = 14! / 5!
例三、求从(0,0)点到(m,n)点的非降路径数
解答:无论哪条路径,必须在x方向上走m步,y方向上走n步,将非降路径数与多重集合 S = { m * x, n * y } 的排列建立一一对应关系,所以格路总数为 P(m+n; mx, ny) = (m+n)! / ( m! * n! ) = C(m+n, n) = C(m+n, m)
一般地,设c>=a, d>=b,则由(a,b)到(c,d)的非降路径数为C(c-a+d-b, c-a)
扩展问题: 在上例基础上若设m<n,求点(0,1)到点(m,n)不接触对角线 y=x的非降路径数据(接触包括穿过)
解答:从(0,1)到(m,n)的非降路径,有的接触 y=x,有的不接触,对于每条接触 y=x的非降路径,做(0,1)关于y=x的对称点(1,0)到(m,n)的对称非降路径,容易看出从(0,1)到(m,n)接触y=x的非降路径与 (1,0)到(m,n)的非降路径(必穿过y=x)一一对应,
故所求的非降路径数为 C(m+n-1, m) - C(m+n-1, m-1)
例四、将r个相同的小球放入n个不同的盒子,总共有多少种方案?
解答:该问题可以转化为r个相同的小球与n-1个相同的盒壁的排列问题
1…1 0 1…1 0 1…1 0 … 0 1…1
其中有 n-1个 0 分成 n段,每段表示不同的盒子, 每段中1的个数表示该盒子里放入的小球总数,总共r个1
即:P( r+n-1; r*1, (n-1)*0 ) = (r+n-1)! / ( r! * (n-1)! ) = C( r+n-1, r)
例五、求集合 X = { 1,2,…, n }的不含相邻整数的k元子集个数
解答:任意一个X的k元子集s都可以对应于一个由0,1组成的有序n重组(a1 a2 … an),其中 ai = 1 当 i属于s,否则 ai = 0,当i不属于s,由于s中不含相邻整数,所以在此n重组中没有两个1是相邻的,所以子集s是与这样的n重组 S = { k*1, (n-k)*0 }之间是一一对应的,由于任意两个1彼此不相邻,故可以把(n-k)个0依次排列,然后在(n-k+1)个空隙中插入k个1,所以从(n-k+1)个空隙中选择k个位置来放置1,有 C(n-k+1, k) 种选法,这也是原问题所对应的答案。
四、母函数
生成函数(母函数)有普通生成函数和指数生成函数:
1.普通生成函数用于解决多重集的组合问题
2.指数型母函数用于解决多重集的排列问题
母函数可以解决递归数列的通项问题:斐波那契数列、卡特兰数列等
普通母函数:
构造母函数G(x), G(x) = a0 + a1x + a2 + a3* +…+ an*, 则称G(x)是数列a0,a1…an的母函数。
通常普通母函数用来解多重集的组合问题,其思想就是构造一个函数来解决问题,一般过程如下:
1.建立模型:
物品n种,每种数量分别为k1,k2,…kn个,每种物品又有一个属性值p1,p2,…pn,(如本题的字母价值),求属性值和为m的物品组合方法数。(若数量ki无穷 也成立,即对应下面式子中第ki项的指数一直到无穷)
2.构造母函数:
G(x)=(1++…)(1+++…)…(1+++…) (一)
=a0 + a1x + a2 + a3* +…+ akk* (设kk=k1·p1+k2·p2+…kn·pn) (二)
G(x)含义: ak 为属性值和为k的组合方法数。
母函数利用的思想:
1.把组合问题的加法法则和幂级数的乘幂对应起来。
2.把离散数列和幂级数对应起来,把离散数列间的相互结合关系对应成为幂级数间的运算关系,最后由幂级数形式来 确定离散数列的构造。
代码实现:
求G(x)时一项一项累乘。先令G=1=(1+0x+0+…0*),再令G=G*(1++…)得到形式(二)的式子…最后令G=G*(1+++…)。
下面是指数型母函数的定义:
对于上面的问题“假设有8个元素,其中a1重复3次,a2重复2次,a3重复3次。从中取r个组合,求其组合数。”:
(感谢 3Dnn 同学指出,下图的 28/3! 应该改为 26/3!)