球盒問題的意思是有n個球,m個盒子,問將n個球放入m個盒子有多少種方案數。(n ≥ m)
其中有三個變量,分別是球是否不同、盒子是否不同、盒子是否為空,因此一共有8個問題。
其中
F[i][j] = F[i - 1][j - 1] + F[i - 1][j] * j
G[i][j] = G[i][j - 1] + G[i - j][j]
- 1.球不同,盒子不同,可以為空:
從一個球入手,每個球都可以放入任何一個盒子,因此每個球有m種放球方案,一共有n個球,所以總方案數是mn。
因為每個球不同,盒子不同,所以不會有重復的情況。
- 2.球相同,盒子不同,不可以為空:
因為球都是相同的,且盒子不同,所以可以使用隔板法來解決這個問題。
考慮將n個球排成一排,中間放入m - 1個隔板(因為盒子不可以為空,所以隔板不能重合且不能放在兩邊),這樣球就被分成了m塊,與將n個球放入m個盒子是一樣的。
所以總的方案數就被轉化成了放隔板的方案數,因為n個球兩兩之間有n - 1個縫隙,需要插入m - 1個隔板,且隔板之間不能重合,所以總的方案數就是C(n - 1, m - 1)。
- 3. 球相同,盒子相同,可以為空:
這個也可以用隔板法來求,因為盒子可以為空,所以板子可以相鄰(及這個盒子為空),同時板子也可以放在兩邊(也表示這個盒子為空)。
這樣又轉化為了放隔板的方案數,但用上面那個解法做起來可能有點麻煩,考慮將球和板子看成同一種物體,有n + m - 1個空位,其中n個空位放球,m - 1個空位放板子,那么在這n + m - 1空位中,放m - 1個板子的方案數就是C(n + m - 1, m - 1);
- 4. 球不同,盒子相同,不可以為空:
這個可以用遞推來求,設F[i][j]表示用j個盒子來裝前i個球的方案數。
考慮第i個球此時的狀態,它可以放入一個新的盒子中,因為所有的盒子都是相同的,所以放入任意一個新的盒子方案數都是相同的,那么方案數為F[i - 1][j - 1](表示前i - 1個球放入j - 1個盒子里,然后用第j個盒子(其實用沒裝過小球的哪個盒子裝都一樣)來裝第i個小球);它也可以放入一個放過球的盒子里,因為球是不同的,所以放入j個盒子中,哪個盒子的方案是不同的,那么方案數就要 * j,及F[i - 1][j] * j(表示前i - 1個球放入j個盒子里,然后第i個小球放入j個盒子中任意一個)。
那么用j個盒子來裝前i個球的方案數就是F[i - 1][j - 1] + F[i - 1][j] * j。
轉移方程為F[i][j] = F[i - 1][j - 1] + F[i - 1][j] * j。
因為不可以為空,所以最后的答案就是F[n][m]。
- 5. 球不同,盒子相同,可以為空:
與上一個不同的是,盒子可以為空,而其他不變,因此F[i][j]的狀態不變,方程轉移也不變,只有最后的答案變了。
因為盒子可以為空,所以最終的答案和盒子的數量無關,因此只需要枚舉盒子數量,答案累加F[n][i](及將n個球放入i個盒子)即可。
- 6. 球不同,盒子不同,不可以為空:
這個和第4個也是一樣的,但是因為這個盒子是不同的,所以最后的答案也會難免增加。
先通過打表發現盒子不同的方案數總是是盒子相同的方案數的 m! 倍,下面證明一下。
對於兩個不同的盒子,在盒子相同的基礎上,每種方案都可以將兩個盒子中的球互換形成一種新的方案,於是盒子不同的方案就是盒子相同的方案的2倍;對於三個不同的盒子,每種方案都可以將第一個盒子中的球與第二個盒子中的球互換,第二個盒子中的球再與第三個盒子中的球互換……以此類推,共有6種互換方式,於是答案就 * 6。像這樣,很容易得出是 * m!。
- 7. 球相同,盒子相同,可以為空:
這種情況用考慮第i個的方法做不出來了,於是考慮用一種操作來模擬放球的過程。
設置兩個操作:1. 新建一個盒子; 2. 將每個盒子中增加一個球
設G[i][j]表示用j個盒子來裝i個球的方案數,易得出轉移方程為G[i][j] = G[i][j - 1](新建一個盒子) + G[i - j][j](將每個盒子中放入一個球)。
對於每個盒子,顯而易見前面盒子中的球個數一定 ≥ 后面盒子中球的個數的,因此答案不會重復。
對於為什么這個操作與球盒問題的第七個相對應,是因為對於球相同且盒子相同,考慮第i個球,它可以放入一個新的盒子,但放入任何一個盒子的方案數都是相同的;它也可以放入一個有球的盒子里,但是在這個盒子中放入這個球后,這個盒子中的球的數量不能大於之前盒子中的數量,否則就會重復。
因此這個問題也是前面盒子中的球個數一定 ≥ 后面盒子中球的個數的,可以發現它與G數組性質一樣,因此它們是一一對應的。
最后的答案就是G[n][m]。
這種做法是憑經驗想出來的。
- 8. 球相同,盒子相同,不可以為空:
這個與上一個一樣,但因為不可以為空,只需要在每個盒子中事先放入一個球即可。
於是這個答案就是G[n - m][m]。