把8個同樣的球放在同樣的5個袋子里,允許有的袋子空着不放,問共有多少種不同的分法?
提示:如果8個球都放在一個袋子里,無論是放哪個袋子,都只算同一種分法。
解析:
把問題合成,先思索5個袋子都不空的狀況,再思索4個袋子不空的狀況,以此類推,最后思索只運用一個袋子的狀況(這種分法只要1種),把一切子狀況的分法數相加求出總分法。
進一步剖析,運用k個袋子裝n個球(袋子不空),一共有幾種分法的問題能夠轉化為k個數相加等於n的種數問題。
運用5個袋子裝8個球則有3種:
1+1+1+1+4 = 8
1+1+1+2+3 = 8
1+1+2+2+2 = 8
運用4個袋子分8個球則有5種:
1+1+1+5=8
1+1+2+4=8
1+1+3+3=8
1+2+2+3=8
2+2+2+2=8
運用3個袋子分8個球則有5種:
1+1+6=8
1+2+5=8
1+3+4=8
2+2+4=8
2+3+3=8
運用2個袋子分8個球則有4種:
1+7=8
2+6=8
3+5=8
4+4=8
運用1個袋子裝8個球則有1種:
8=8
因而,該問題的答案即為一切子狀況下的和,3+5+5+4+1 = 18。
擴展局部:
關於將一個整數 N 合成成 K 個不為0的數之和,能夠應用遞歸加動態規划來停止快速運算。
遞推公式為:
f(n, k) = f(n-1, k-1) + f(n-k, k)
遞歸出口為:
f(n, k) = 1, 當 k == 1 或 n == k;(很明顯,只要一個袋子,或者袋子數和球數相同時只要一種分法)
f(n, k) = 0, 當 n < k;(球數比袋子數少,則必然存在尚未應用的袋子,無解)
接下來停止剖析:
f(n-1, k-1)怎樣了解呢,就是把第 1 個數放成 1,然后把剩下的 n-1 這個數分紅 k-1 份。f(n-1, k-1)就是原n,k問題中第一個數是 1 的一切分的辦法數;
f(n-k, k) 就是原n,k問題中第一個數不是 1(大於1),能夠分的辦法數。這是一個關鍵點。認真剖析,相當於給 k 個位置,每個位置先放一個 1,(相當於每個袋子都有1個球)。接下來剩下的 n-k ,這個數字再往這 k 個位置上分,(相當於把剩下的球分給袋子,仍保證應用一切袋子)這能夠保證第一個位置至少比1大(第一個袋子的球數大於1)。
來源:知乎Ron Tang