mioj發糖果

小米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,表示有多少種分法。


解題思路

這個題是非常經典的動態規劃問題我們把這個問題分成很多種情況

  1. 最特殊的一個情況 是當沒有蘋果或者是隻有一個盤子的時候
  2. 當盤子數比蘋果數多的時候,此時若減去N-M個盤子,結果不變
  3. 當盤子數小於等於蘋果時,分兩種情況,當有盤子空着的時候:和減去一個盤子後分類的總數是一樣的,當沒有盤子空着的時候:每個盤子至少先放一個,此時和每個盤子減去一個蘋果後的情況是一樣的。那麼此項就是這兩種情況的加和。

#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;

}

這個題目算是一個比較經典的動態規劃的題目。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章