一:解题思路
f(m,n) 为m个苹果,n个盘子的方法数目。
递归出口说明:当m=0 || n=1 只有一种放法。
当n>m时:必定至少有n-m个盘子永远空着,去掉他们对摆放苹果数目不产生影响。即 if(n>m) f(m,n)=f(m,m)
当n<=m时:不同的方法可以分成2类:
1.至少一个盘子空着,即相当于f(m,n)=f(m,n-1)
2.所有盘子都有苹果,相当于可以从每个盘子中拿掉一个苹果,不影响不同的方法的数目,即f(m,n)=f(m-n,n)
二:完整代码示例 (C++版和Java版)
C++:
#include <iostream> using namespace std; int apples(int m, int n) { if (m == 0 || n == 1) return 1; if (m < n) return apples(m, m); else return apples(m, n - 1) + apples(m-n,n); } int main() { int m = 0; int n = 0; while (cin >> m >> n) { cout << apples(m,n) << endl; } return 0; }