放苹果问题 POJ 1664

M个苹果放到N个盘子里一共会有多少种不同的方法。比如在M=7,N = 3的情况中,(1 5 1) (5 1 1)是同一种情况。

 
f(1, N) = 1
f(M, 1) = 1
 
当N > M时,也就是说苹果一定不能把所有的盘子都占用,那么它与用N-1个盘子的结果是一样的。
f(M, N) = f(M, N - 1)
当N <= M时,分为两种情况,第一种情况是说有的盘子都占了,每个至少放一个,剩下M-N个苹果放到N个盘子里;第二种情况没有全部用到,就是将M个苹果放到N-1个盘子里。
f(M, N) = f(M-N, N) + f(M, N-1)
 
 
 1 #include <iostream>
 2 using namespace std;
 3 
 4 int f(int M, int N)
 5 {
 6     if(M == 1 || N == 1) return 1;
 7     else if(N > M) return f(M, N-1);
 8     else return f(M-N, N) + f(M, N-1);
 9 }
10 
11 int main()
12 {
13     int M, N, num;
14     cin >> num;
15     for(int i = 0; i < num; i++) {
16         cin >> M >> N;
17         cout << f(M, N) << endl;
18     }
19     return 0;
20 }

 

posted @ 2014-05-26 22:03  memcpy  阅读(169)  评论(0编辑  收藏  举报