小米oj
刷一下動態規劃的經典題型,M個蘋果放進N個盤子,一共有多少放法。
發糖果
描述
將 M 個同樣的糖果放在 N 個同樣的籃子裏,允許有的籃子空着不放,共有多少種不同的分法? 比如,把 7 個糖果放在 3 個籃子裏,共有 8 種分法(每個數表示籃子中放的糖果數,數的個數爲籃子數): 1 1 5 1 2 4 1 3 3 2 2 3 2 5 0 3 4 0 6 1 0 7 0 0注意:相同的分佈,順序不同也只算作一種分法,如 7 0 0、0 7 0 和 0 0 7 只算作一種。
輸入
輸入包含二個正整數 M 和 N,以(,)分開,M 表示有幾個同樣的糖果,N 表示有幾個同樣的籃子 M與N範圍:1 <= M,N <= 100。
輸出
輸出一個正整數 K,表示有多少種分法。
解題思路
這個題是非常經典的動態規劃問題我們把這個問題分成很多種情況
- 最特殊的一個情況 是當沒有蘋果或者是隻有一個盤子的時候
- 當盤子數比蘋果數多的時候,此時若減去N-M個盤子,結果不變
- 當盤子數小於等於蘋果時,分兩種情況,當有盤子空着的時候:和減去一個盤子後分類的總數是一樣的,當沒有盤子空着的時候:每個盤子至少先放一個,此時和每個盤子減去一個蘋果後的情況是一樣的。那麼此項就是這兩種情況的加和。
#include "stdio.h"
#include "stdlib.h"
int s(int m, int n)
{
if (m == 0 || n == 1)//一個盤子或者沒有蘋果的時候只有一種
return 1;
if (n > m)//如果盤子數目多於蘋果數目,那麼盤子數和蘋果樹一樣也是相同的結果
return s(m, m);
if (n <= m)//剩下的情況分爲有盤子空着和沒盤子空着
return s(m, n - 1) + s(m - n, n);
return 0;
}
//找最先到達終點的點
int main()
{
int a = 0, b = 0;
scanf("%d ,%d",&a,&b);
printf("%d ", s(a, b));
return 0;
}
這個題目算是一個比較經典的動態規劃的題目。