放蘋果
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 23151 | Accepted: 14696 |
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
題目分析:
用for循環控制輸入的次數。
當M=0或者N=1時,只有一種放的方式。
當N<M時,相當於把M個蘋果放進M個盤子裏。
當N小於等於M時,可以分爲兩種情況:每個盤子裏至少有一個蘋果,或者至少有一個盤子裏沒有蘋果。
對於每個盤子裏至少有一個蘋果的情況,可以從每個盤子裏拿出一個蘋果,即相當於把M-N個蘋果放進N個盤子裏。
對於第二種情況,可以將不放蘋果的盤子除去,即相當於把M個蘋果放進N-1個盤子裏。
綜上分析可以得到遞歸公式:F(M,N)=F(M-N,N)+F(M,N-1)。
C源代碼:
#include<stdio.h>
int f(int m,int n);
int main(){
int t,m,n;
scanf("%d",&t);
for(;t>0;t--){
scanf("%d%d",&m,&n);
printf("%d\n",f(m,n));
}
return 0;
}
int f(int m,int n){
int k;
if(m==0||n==1)
k=1;
else
if(n>m)
k=f(m,m);
else
k=f(m,n-1)+f(m-n,n);
return k;
}