POJ-1664 放苹果
解题思路:我们不妨令f(m,n)表示m个苹果放到n个盘子里有多少种放法,下面对不同的情况给予讨论:
(1):当盘子数为1的时候,只有一种放法就是把所有苹果放到一个盘子里。
(2):当苹果数为1的时候,也只有一种放法,注意题目中说明,盘子之间并无顺序,所以不管这个苹果放在哪个盘子里,结果都算一个。
(3):当m<n时,因为此时最多只能放到m个盘子中去(一个里放一个),实际上就相当于把m个苹果放到m个盘子里一样,也就是f(m,m);
(4):当m>=n时,也分两种情况讨论,一种是至少有一个盘子里不放苹果,这样子就相当于f(m,n-1),第二种是,先取出n个苹果一个盘子里放一个,再将剩下的m-n个苹果放到n个盘子里去,即f(m-n,n);
综上所述,得到递归表达式:
f(m,n)=1 当 m=1或n=1;
f(m,n)=f(m,m) 当m<n;
f(m,n)=f(m-n,n)+f(m,n-1);
代码如下:
1 #include<iostream> 2 using namespace std; 3 4 int fun(int x,int y) 5 { 6 if(x==1||x==0||y==1) 7 return 1; 8 if(x<y) 9 return fun(x,x); 10 else return fun(x-y,y)+fun(x,y-1); 11 } 12 13 int main() 14 { 15 int t,m,n,k; 16 cin>>t; 17 while(t--) 18 { 19 cin>>m>>n; 20 cout<<fun(m,n)<<endl; 21 } 22 return 0; 23 }