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 }

 

posted @ 2014-02-14 13:24  Pacific-hong  阅读(126)  评论(0编辑  收藏  举报