1. 程式人生 > >小球與盒子23事

小球與盒子23事

假設 枚舉 power 不能 font mic 不同的 小球 sigma

球,盒子都可以分成是否不能區分,和能區分,還能分成是否能有空箱子,

所以一共是8種情況,我們現在來一一討論。

1.球同,盒不同,無空箱

C(n-1,m-1), n>=m
0, n<m

使用插板法:n個球中間有n-1個間隙,現在要分成m個盒子,而且不能有空箱子,所以只要在n-1個間隙選出m-1個間隙即可

2.球同,盒不同,允許空箱

C(n+m-1,m-1)

我們在第1類情況下繼續討論,我們可以先假設m個盒子裏都放好了1個球,所以說白了就是,現在有m+n個相同的球,要放入m個不同的箱子,沒有空箱。也就是第1種情況

3.球不同,盒相同,無空箱

第二類斯特林數dp[n][m]
dp[n][m]=m*dp[n-1][m]+dp[n-1][m-1],1<=m<n


dp[k][k]=1,k>=0
dp[k][0]=0,k>=1
0,n<m

這種情況就是第二類斯特林數,我們來理解一下這個轉移方程。

對於第n個球,如果前面的n-1個球已經放在了m個箱子裏,那麽現在第n個球放在哪個箱子都是可以的,所以m*dp[n-1][m];

如果前n-1個球已經放在了m-1個箱子裏,那麽現在第n個球必須要新開一個箱子來存放,所以dp[n-1][m-1]

其他的都沒法轉移過來

4.球不同,盒相同,允許空箱

sigma dp[n][i],0<=i<=m,dp[n][m]為情況3的第二類斯特林數

這種情況就是在第3種情況的前提下,去枚舉使用的箱子的個數

5.球不同,盒不同,無空箱

dp[n][m]*fact[m],dp[n][m]為情況3的第二類斯特林數,fact[m]為m的階乘

因為球是不同的,所以dp[n][m]得到的盒子相同的情況,只要再給盒子定義順序,就等於現在的答案了

6.球不同,盒不同,允許空箱

power(m,n) 表示m的n次方

每個球都有m種選擇,所以就等於m^n

7.球同,盒同,允許空箱

dp[n][m]=dp[n][m-1]+dp[n-m][m], n>=m
dp[n][m]=dp[n][m-1], n<m
邊界dp[k][1]=1,dp[1][k]=1,dp[0][k]=1

現在有n個球,和m個箱子,我可以選擇在所有箱子裏面都放上1個球,也可以不選擇這個操作。

如果選擇了這個操作,那麽就從dp[n-m][m]轉移過來

如果沒有選擇這個操作,那麽就從dp[n][m-1]轉移過來

8.球同,盒同,無空箱

dp[n-m][m],dp同第7種情況,n>=m
0, n<m

因為要求無空箱,我們先在每個箱子裏面放1個球,然後還剩下n-m個球了,再根據情況7答案就出來了

小球與盒子23事