放苹果——递归
作者:互联网
这题和上一题一样都是将问题分解为若干个子问题,这题难度会大一点,递归关系自己想的话不是那么好想:
这题和上一题一样,先找递推式,但是这题的递推式会稍微难一点,有两种情况,第一种情况是盘子的数量比苹果的数量多的情况,如果苹果少的话,就相当于最多只能i个盘子每个盘子放1个苹果,剩下的空盘子就不管了。第二种情况就是盘子少的话,如果有空盘子的话,就i至少会有一个空盘子把,所以就把盘子数减一继续递归,没有空盘子的方法至少每一个盘子里都有一个苹果把,先把苹果分完之后再继续这些不同的分法。
这两题很明显就可以看出来递归的格式与思路了,最后最重要的就是边界条件的确定。边界无非就是盘数为0的话就只有1种分法,如果苹果数是0的话就只有0种分法。
#include <iostream> using namespace std; int f(int m, int n){ if(n>m){ return f(m,m); } if(m == 0) return 1; if(n == 0) return 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; }
标签:return,递归,int,这题,苹果,盘子 来源: https://www.cnblogs.com/chengzhangpeideboke/p/15861278.html