N個相同的球,放入M個相同的盒子中,允許有盒子為空,請問有多少種方法?
01-30
涉及分拆數,沒有close form.答案是p(n,1)+p(n,2)+…+p(n,k).p(n,k)是分拆數
這麼多回答擋板或者不定方程整數解的是怎麼回事啊?
@王芊的答案是正確的。關於這類題目的總結可以參見:
http://pan.baidu.com/s/1jGFBSNk
裡面有一張 37balabala.jpg,總結了所有情況(不知道為什麼我每次傳圖到知乎都掛,就傳網盤了)。
劃分數沒有具體的表達式,可以用生成函數計算。十個不同的球放入十個不同的盒子里,哈哈真簡單,咦不對,是相同的,哇塞,都是相同的,好難啊!不如退一步假如我給某個東西加上順序,比如說盒子1,2,3,4......這是什麼問題呢?n個未知數之和為M,求整數解我們假想m是同等數量的小珠子,我們要做的是用隔板隔開一共需要n-1個隔板
只要把球與隔板隨機排列就行了
每一個排法對應一個解這個求法對應概率上的partition把一個集合分成兩個集合,兩集合內部順序不重要,兩集合相對位置才重要故根據partition,抽法就是從n+m-1中抽出m個。因為每一個解,是有順序的,101不等於011然而我們的盒子是沒有編號的。故最後每種組合對應m!排列partition結果處以m!即為答案這個問題可以遞歸的解決。
首先我們假設2,1,1和1,2,1是一種相同的放法。
定義f(n, m)為n個球放入m個盒中的放法數目。
- 當m&>n, 則總會有m-n個盒子空著,去掉他們對總的放法不產生影響,即 if(m &> n) f(n, m) = f(n, n)
- 當m&<=n,可分兩種情況:
- 至少有一個盒子空著,則 f(n, m) = f(n, m-1);
- 所有盒子都有球,我們可以從每個盒子中拿掉一個球而不影響總的放法,則 f(n, m) = f(n-m, m);
所以對於m&<=n的情況,有 f(n, m)=f(n, m-1) + f(n-m, m)
代碼:int f(n, m){ if(m == 1 || n == 0) return 1;if(m &> n) return f(n, n);
return f(n, m-1) + f(n-m, m);}對其他的答案做一個補充:
這個問題在組合數學(combinatorics)里叫做stars and bars問題,詳見https://en.wikipedia.org/wiki/Stars_and_bars_(combinatorics)。
通過隔板法解決。PS:其實還有更高端的題目,比如增加一個條件,球的顏色各不相同,就更好玩了。其實都是數論(Number Theory)裡面的問題,詳見Composition (combinatorics)以及Partition (number theory)。這裡有個計算器,可以直接算結果的,Partition calculators using java applets。結果是很嚇人!推薦閱讀:
※任何一個置換寫成對換的乘積時對換個數的奇偶性不變?
※N個球面最多將3維空間分成多少個部分?
※擬陣(matroid)理論背後的motivation是什麼?
※可重圓排列問題的方案數?
※一個 n*n 的方格陣,至多塗黑多少個使得不存在 4 個黑格為某矩形頂點?
TAG:演算法 | 數學 | 組合數學Combinatorics |