多重集合的排列和組合問題
一、先來回顧一下無重複元素的排列組合定義
排列,英文名為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)
=
由公式可以看出多重集合的組合只與類別數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) 種選法,這也是原問題所對應的答案。
其他例子.......To Be Continue