放苹果问题 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 }