放蘋果
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 21021 | Accepted: 13395 |
Description
把M個同樣的蘋果放在N個同樣的盤子里,允許有的盤子空着不放,問共有多少種不同的分法?(用K表示)5,1,1和1,5,1 是同一種分法。
Input
第一行是測試數據的數目t(0 <= t <= 20)。以下每行均包含二個整數M和N,以空格分開。1<=M,N<=10。
Output
對輸入的每組數據M和N,用一行輸出相應的K。
Sample Input
1 7 3
Sample Output
8
1 /* 功能Function Description: POJ-1664 2 開發環境Environment: DEV C++ 4.9.9.1 3 技術特點Technique: 4 版本Version: 5 作者Author: 可笑痴狂 6 日期Date: 20120815 7 備注Notes: 8 解題分析: 9 設f(m,n) 為m個蘋果,n個盤子的放法數目,則先對n作討論, 10 當n>m:必定有n-m個盤子永遠空着,去掉它們對擺放蘋果方法數目不產生影響。即if(n>m) f(m,n) = f(m,m) 11 當n<=m:不同的放法可以分成兩類: 12 1、有至少一個盤子空着,即相當於f(m,n) = f(m,n-1); 13 2、所有盤子都有蘋果,相當於可以從每個盤子中拿掉一個蘋果,不影響不同放法的數目,即f(m,n) = f(m-n,n). 14 而總的放蘋果的放法數目等於兩者的和,即 f(m,n) =f(m,n-1)+f(m-n,n) 15 遞歸出口條件說明: 16 當n=1時,所有蘋果都必須放在一個盤子里,所以返回1; 17 當沒有蘋果可放時,定義為1種放法; 18 遞歸的兩條路,第一條n會逐漸減少,終會到達出口n==1; 19 第二條m會逐漸減少,因為n>m時,我們會return f(m,m) 所以終會到達出口m==0. 20 */ 21 #include<stdio.h> 22 23 int fun(int m,int n) //m個蘋果放在n個盤子中共有幾種方法 24 { 25 if(m==0||n==1) //因為我們總是讓m>=n來求解的,所以m-n>=0,所以讓m=0時候結束,如果改為m=1, 26 return 1; //則可能出現m-n=0的情況從而不能得到正確解 27 if(n>m) 28 return fun(m,m); 29 else 30 return fun(m,n-1)+fun(m-n,n); 31 } 32 33 int main() 34 { 35 int T,m,n; 36 scanf("%d",&T); 37 while(T--) 38 { 39 scanf("%d%d",&m,&n); 40 printf("%d\n",fun(m,n)); 41 } 42 }