http://www.docin.com/p-705193918.html
http://blog.csdn.net/kennyrose/article/details/7469528
http://www.docin.com/p-129149266.html
一、先来回顾一下无重复元素的排列组合定义
排列,英文名为Permutation,是指从某元素集合中取出指定个数的元素进行排序
组合,英文名为Combination,是指从某元素集合中仅仅取出指定个数的元素,不考虑排序
从有n个不同元素的集合任取r个元素的排列方式有:P(n, r) = n*(n-1)*...*(n-r+1) = n! / (n-r)!,特别地 P(n,n) = n!
从有n个不同元素的集合任取r个元素的组合方式有:C(n, r) = P(n, r) / r! = n! / ( (n-r)! * r!),特别地C(n,n) = 1
二、下面我们来定义多重集合(multiset)的排列组合
设多重集合 S = { n1 * a1, n2 * a2, ..., nk * ak },n = n1 + n2 + ... + nk,
即集合 S 中含有n1个元素a1, n2个元素a2,...,nk个元素ak,ni被称为元素ai的重数,k成为多重集合的类别数
在 S 中任选 r 个元素的排列称为S的r排列,当r = n时,有公式 P(n; n1*a1, n2*a2, ..., nk*ak) = n! / (n1! * n2! * ...* nk!)
在 S 中任选 r 个元素的组合称为S的r组合,当r<=任意ni时,有公式 C(n; n1*a1, n2*a2, ..., nk*ak) = C(k+r-1, r),
由公式可以看出多重集合的组合只与类别数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;5*1, 1*p1, 1*p2, ..., 1*p9) = 14! / ( 5! * 1! * .... 1! ) = 14! / 5!
例三、求从(0,0)点到(m,n)点的非降路径数
解答:无论哪条路径,必须在x方向上走m步,y方向上走n步,将非降路径数与多重集合 S = { m * x, n * y } 的排列建立一一对应关系,所以格路总数为 P(m+n; m*x, n*y) = (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) 种选法,这也是原问题所对应的答案。