【模型】球盒問題
球盒問題是組合數學中的經典問題,問題統一一下就是這樣: 有 個(不)同的球,放進 個(不)同的盒子裡,(不)允許有空盒,求方案數。
根據上面的描述可以看出,這個問題總共有 種情況,我們一個一個來看。為了方便起見,我們只考慮有解的情況 。
-
球相同,盒不同,無空盒
可以用插板法, 個球中總共有 個空隙,根據條件,我們只需要在 個空隙中插 個板子即可。
-
球相同,盒不同,有空盒
既然允許有空盒,那麼我們可以多加 個“虛”的球,預先塞進每個盒子。
這樣問題就化歸成了有 個相同的球和 個不同的盒子,不允許有空盒的情況,直接運用上面的結論就可以解決問題了。
-
球不同,盒相同,無空盒
邊界條件 ,
考慮DP
令 表示已經放了 個球,放進了 個盒子(非空)的方案數。
對於第 個球,如果之前的 個球已經放在了 個盒子裡,那麼第 個球就可以隨便放在這 個盒子中(因為我沒有新開一個盒子),那麼答案就是 。
另外,如果我是新開了一個盒子,那麼只有一種可能,答案是
順便說一句,其實敏感的讀者已經發現了,這就是第二類斯特林數。
-
球不同,盒相同,有空盒
狀態轉移方程同上一種情況
其實允許空盒就是可以不用把 個盒子全部用完,那麼就直接在上一種情況的基礎上列舉實際用到的盒子的個數,將答案累加起來就可以了。
-
球不同,盒不同,無空盒
較第三種情況就多了盒的有序性,處理方法也很簡單,給盒子標個號, 打亂一下即可。
-
球不同,盒不同,有空盒
這大概是最簡單的一種情況了吧,每個球都有 個位子可以放,根據乘法原理,答案就是 。
-
球相同,盒相同,有空盒
邊界條件
還是考慮DP,但是和第二類斯特林數搭不上邊了,倒是和自然數拆分有點相似。
和之前相似的定義, 表示已放進 個球,有 個盒子。
考慮小球比盒子多時,可以選擇將盤子不放滿或者放滿分別對應 和 。
但小球比盒子少時,已經不存在放滿的情況了,直接 。
-
球相同,盒相同,無空盒
狀態轉移方程同上一種情況。
由於球相同,我們可以想到一個簡便的辦法化歸到上一種情況:實現給每個盒子底部先墊一個球,接下來就是上一種情況了。
以上就是對 種情況的討論,可以看出,其中用到的化歸思想的地方比較多,要熟練掌握的話需要對其中各個模型的聯絡相當熟悉。