標籤:des style blog http java color
Time Limit:1000MS
Memory Limit:10000KB
64bit IO Format:%I64d & %I64uSubmit Status
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
17 3
Sample Output
8
1 #include<cstdio> 2 using namespace std; 3 int f(int m,int n) 4 { 5 if(n==1||m==0) 6 return 1; 7 if(n>m) 8 return f(m,m); 9 else10 return f(m,n-1)+f(m-n,n);11 }12 int main()13 {14 int m,n;15 int t;16 scanf("%d",&t);17 while(t--)18 {19 scanf("%d%d",&m,&n);20 printf("%d\n",f(m,n));21 }22 return 0;23 }
遞推。
設f(m,n)為m個蘋果,n個盤子的放法數目,先對n討論:
當n>m必定有n-m個盤子永遠空著;當n<=m時,1)至少有一個盤子空著,即相當於f(m,n)=f(m,n-1);2)所有盤子都有蘋果,相當於可以從每個盤子拿掉一個蘋果,不影響不同放法的數目,f(m,n)=f(m-n,n);
遞迴出口條件:當n=1時,所有蘋果必須放在一個盤子上,返回1;當沒有蘋果時,定義為一种放法;
遞迴的兩條路:第一條會逐漸減小到n==1;第二條m會逐漸減少,因為n>m時,returnf(m,m),所以終會到達出口m==0