1. 程式人生 > >一些簡單的排列組合問題

一些簡單的排列組合問題

-c title 區域 傳送門 log height clas -- class

排列及計算公式 從n個不同元素中,任取m(m≤n)個元素按照一定的順序排成一列,叫做從n個不同元素中取出m個元素的一個排列;從n個不同元素中取出m(m≤n)個元素的所有排列的個數,叫做從n個不同元素中取出m個元素的排列數,用符號 技術分享 A(n,m)表示或 技術分享 【P(n,m)】表示。 A(n,m)=n(n-1)(n-2)……(n-m+1)= n!/(n-m)!(當n=m時,上述式子分母為0!=1). 組合及計算公式 從n個不同元素中,任取m(m≤n)個元素並成一組,叫做從n個不同元素中取出m個元素的一個組合;從n個不同元素中取出m(m≤n)個元素的所有組合的個數,叫做從n個不同元素中取出m個元素的組合數.用符號
C(n,m) 表示。(C即Combination). C(n,m)=A(n,m)/m!=n!/((n-m)!*m!);C(n,m)=C(n,n-m); ----摘自百度百科

例1:傳送門

例2:將n個相同的球放到m個不同的袋子裏有幾種方案?

分析:假設m=3,n=2,我們可以這麽放(*代表求,空白區域代表袋子): *| |*,還可以這麽放: |**| ,還可以這麽放:| |**......這樣的話就有m-1個隔板(|)和n個球需要放置在n+m-1個位置中,考慮放置隔板的方案數為C(n+m-1,m-1),考慮求的方案數為C(n+m-1,n),那麽答案為C(n+m-1,m-1) = C(n+m-1,n).

例3:將n個不同的球放到m個不同的袋子裏有幾種方案?

分析:第一個袋子可以放n種球,第二個袋子可以放n-1種球......第m個袋子可以放n-m種球,答案為n*(n-1)*...*(n-m).這樣分析有點麻煩,因為每一種球都是不一樣的,每一種球都只能放進1個袋子裏,而每一種袋子則不一樣,可以裝下n種球。所以我們對球進行分析:第一個球可以放m個袋子裏,第二個球可以放m個袋子裏,...,第n個球可以放m個袋子裏,答案為m^n.

例4:將n個不同的球放到m個相同的袋子裏有幾種方案?

分析:袋子相同就沒辦法用數學公式推導了,考慮dp.令f[i][j]表示前i個球放在j個袋子裏的方案數。考慮第i個球怎麽放,如果第i個球占用了一個新的袋子,那麽f[i][j] += f[i-1][j-1]就好了。如果沒有呢?那麽這個球就能放到j個袋子裏,即f[i][j] += f[i-1][j] * j,合並一下f[i][j] = f[i-1][j-1] + f[i-1][j] * j.答案是f[n][1] + f[n][2] + ...+ f[n][m]

例5:將n個相同的球放到m個相同的袋子裏有幾種方案?

分析:球相同,袋子也相同,這要怎麽計數啊QAQ,要既不多也不少的計數,肯定是有某一種順序,我們按照每個袋子裝球的數量降序排列,這就相當於把相同的袋子強行當成了不同的袋子,為了維護這個降序,我們一旦在第i個袋子放一個球,那麽前面的袋子都必須要放一個球,當然,我們也可以考慮不在這個位置多放一個球,我們在後面的袋子放,所以f[i][j] = f[i-j][j] + f[i][j-1].這道題和上一道題有一個很大的區別,上一道題的狀態轉移方程沒有考慮不放的情況,是因為袋子是相同的,放在這個袋子和那個袋子是沒有區別的,我們硬性規定第i個球必須放在我們選定的j個袋子中,而這一題雖然題面上說袋子相同,但是我們硬性規定是不同的,所以可以考慮不放的情況。

總結:這四道題可以得出一個規律:袋子不同用數學,袋子相同用dp,不同和相同的區別在於,不同的話我們可以單獨考慮第i個,相同的話必須要變成“不同”的才能單獨考慮!

一些簡單的排列組合問題