1664 放苹果

AC代码

/**********************************************************************/
/* _ _ __ __ ____ _____ */
/* | | | | | \/ | / ___| | ___| */
/* | | | | | |\/| | | | | |___ */
/* | |_| | | | | | | |___ | |___| */
/* \___/ |_| |_| \____| |_| */
/**********************************************************************/
#include <iostream>
using namespace std;

int apple(int m, int n)//m苹果,n盘子 1<=M,N<=10。
{ // 1<=M<=10 1<=N<=10
if(m == 0)
{
return 1;
}
if(n <= 0)
{
return 0;
}
if(m < n)
{
return apple(m,m);
}
// if(m == n)
// {
// return 1;
// }
if(m >= n)
{
return apple(m,n-1)+apple(m-n,n);
}

}

int main()
{
int t = 0,m = 0 ,n = 0;
cin >> t;
while(t--)
{
cin >>m >> n;
cout << apple(m,n)<< endl;
}
return 0;
}

解析

​参看中国大学慕课郭炜老师课程讲解递归二​​​ 当m<n时,一定会空出n-m个盘子,所以
``c

``
m>=n时,有空盘子的情况和将m苹果放满n-1盘子里是一样的,这里递归一下
没有空盘子的情况,和先每个盘子放一个苹果,再往剩下n个盘子里放m-n苹果

其实主要是递归式和边界条件的寻找

分为两步

找变化的量

分析变量的变化

边界条件为什么是
​​​c if(m == 0) { return 1; } if(n <= 0) { return 0; }​​​ 因为
​return apple(m,n-1)+apple(m-n,n);​​ 中,n不断变化,每次减一 m不断变化,每次m-n
m-n只可能>=0,因为每次一进入,进行了筛选,所以考虑 m==0
n最终也会减到0

新知识

持续输入

while(t--)//比for少写几行
{
cin >>m >> n;
cout << apple(m,n)<< endl;
}

该题目要求持续输入,持续输出答案运用上述语句立即输入!