解题思路:
f(i,k-1)
代表空一个盘子出来,苹果放入剩下的盘子( k - 1)中的放法
f(i-k,k)
代表每一个苹果放到一个盘子中,剩下的苹果( i - k )再放入盘子中的放法
因为执行f(i-k)
的前提是k <= i
,故i-k
不可能小于0,至少等于0;而 k 逐级减 1 ,也不可能小于0,故边界条件为n > m
和m == 0
和n == 0
代码:
#include <iostream>
using namespace std;
int f(int m,int n)
{
if(n > m) return f(m,m); //苹果数小于盘子数 相当于 苹果数等于盘子数 的放法
if( m == 0) return 1; //没有苹果,空盘子为一种放法,返回 1
if( n == 0 ) return 0; //没有盘子,就没有选择,返回 0
return f(m,n-1) + f(m-n,n);
}
int main()
{
int t, m, n;
cin >> t;
while(t--)
{
cin >> m >> n;
cout << f(m,n) << endl;
}
return 0;
}
抽象递归,永远滴神!