1. 程式人生 > >【模型】球盒問題

【模型】球盒問題

球盒問題是組合數學中的經典問題,問題統一一下就是這樣: 有 nn 個(不)同的球,放進 mm 個(不)同的盒子裡,(不)允許有空盒,求方案數。

根據上面的描述可以看出,這個問題總共有 88 種情況,我們一個一個來看。為了方便起見,我們只考慮有解的情況

  • 球相同,盒不同,無空盒

    Cn1m1C_{n - 1}^{m - 1}

    可以用插板法,nn 個球中總共有 n1n - 1 個空隙,根據條件,我們只需要在 n1n - 1 個空隙中插 m1m-1 個板子即可。

  • 球相同,盒不同,有空盒

    Cn+m1m1C_{n + m - 1}^{m - 1}

    既然允許有空盒,那麼我們可以多加 mm 個“虛”的球,預先塞進每個盒子。

    這樣問題就化歸成了有 n+mn + m 個相同的球和 mm 個不同的盒子,不允許有空盒的情況,直接運用上面的結論就可以解決問題了。

  • 球不同,盒相同,無空盒

    d(n,m)=d(n1,m1)+m×d(n1,m),m<nd(n, m) = d(n - 1, m - 1) + m \times d(n - 1,m) ,m < n

    邊界條件 d(k,k)=1d(k, k)=1d

    (k,0)=0d(k, 0)=0

    考慮DP

    d(n,m)d(n, m) 表示已經放了 nn 個球,放進了 mm 個盒子(非空)的方案數。

    對於第 nn 個球,如果之前的 n1n - 1 個球已經放在了 mm 個盒子裡,那麼第 nn 個球就可以隨便放在這 mm 個盒子中(因為我沒有新開一個盒子),那麼答案就是 m×d(n1,m)m \times d(n - 1, m)

    另外,如果我是新開了一個盒子,那麼只有一種可能,答案是 d(n1,m1)d(n - 1, m - 1)

    順便說一句,其實敏感的讀者已經發現了,這就是第二類斯特林數。

  • 球不同,盒相同,有空盒

    i=0md(n,i)\sum_{i=0}^{m} d(n, i) dd 狀態轉移方程同上一種情況

    其實允許空盒就是可以不用把 mm 個盒子全部用完,那麼就直接在上一種情況的基礎上列舉實際用到的盒子的個數,將答案累加起來就可以了。

  • 球不同,盒不同,無空盒

    m!×d(n,m)m! \times d(n, m)

    較第三種情況就多了盒的有序性,處理方法也很簡單,給盒子標個號, AmmA_m^m 打亂一下即可。

  • 球不同,盒不同,有空盒

    mnm^n

    這大概是最簡單的一種情況了吧,每個球都有 mm 個位子可以放,根據乘法原理,答案就是 mnm^n

  • 球相同,盒相同,有空盒

    d(n,m)=d(n,m1)+d(nm,m),mnd(n, m)=d(n, m - 1) + d(n - m, m), m \leq n

    d(n,m)=d(n,m1),m>nd(n, m) = d(n, m - 1), m > n

    邊界條件 d(k,1)=1,d(1,k)=1,d(0,k)=1d(k, 1)=1,d(1,k)=1,d(0, k)=1

    還是考慮DP,但是和第二類斯特林數搭不上邊了,倒是和自然數拆分有點相似。

    和之前相似的定義,d(n,m)d(n, m) 表示已放進 nn 個球,有 mm 個盒子。

    考慮小球比盒子多時,可以選擇將盤子不放滿或者放滿分別對應 d(n,m1)d(n, m - 1)d(nm,m)d(n - m, m)

    但小球比盒子少時,已經不存在放滿的情況了,直接 d(n,m1)d(n, m - 1)

  • 球相同,盒相同,無空盒

    d(nm,m)d(n - m, m) dd 狀態轉移方程同上一種情況。

    由於球相同,我們可以想到一個簡便的辦法化歸到上一種情況:實現給每個盒子底部先墊一個球,接下來就是上一種情況了。

以上就是對 88 種情況的討論,可以看出,其中用到的化歸思想的地方比較多,要熟練掌握的話需要對其中各個模型的聯絡相當熟悉。