打算在期末考試之前把數算的相關題目刷一刷,期末如果像期中這麼慘就沒得玩了,發現線性表裏最水的一道放蘋果,就順手寫掉好了,這樣想想,放蘋果還是我學的第一道遞歸的題目,當時真是理解了好久都沒弄明白,後來程序設計實習的簡單整數劃分用DP也是累的夠嗆,重看這道題覺得當時自己真的好蠢= = 就從最簡單的開始吧,每天寫一點,避免期末的時候手忙腳亂
程序只需要一個遞歸就可以完成了,notation(m,n)是m個蘋果放在n個盤子裏面並且把這n個盤子完全用掉的方案數量,總的遞歸返回的是放蘋果的方案總數
1、如果盤子的數量多於蘋果的數量,那麼這種情況的方案總數和盤子的數量等於蘋果的數量相同;
2、如果蘋果的數量多於盤子的數量,那麼方案總數就等於把蘋果數量不變,盤子總數減一的方案數量加上蘋果數減去盤子數,盤子數不變的方案數量
3、最後確定邊界條件,蘋果數爲1的時候方案只有一種,盤子數爲0的情況也記爲一種方案(等價於盤子數和蘋果數相同的情況)。
#include<cstdio>
#include<iostream>
using namespace std;
int notation(int m,int n){
if(m<=0)
return 1;
if(n<=1)
return 1;
if(m<n)
return notation(m,m);
if(m>=n)
return notation(m-n,n) + notation(m,n-1);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int m,n;
scanf("%d%d",&m,&n);
printf("%d\n",notation(m,n));
}
//system("pause");
return 0;
}