前言
前几天作业太多了,所以没有更新,感谢各位没有取关。
题目传送门
思路:
先看这道题的数据:1≤m,n≤10,这么小的数据,你爱咋搞就咋搞,写个不加记忆化的递归都能过,本蒟蒻用的就是这种递归(因为本蒟蒻不会动态规划,又懒得写记忆化)。
我们设为苹果数是apple个时,盘子数是plate个时的答案
我们先分为两种情况。
1.盘子数比苹果数多。
先看一组数据:
有250个苹果和114514个盘子,这样总会有最多114264个盘子不装苹果,所以这些盘子是无用的,也就是说这些盘子有还是没有都不会影响答案,所以=
。
2.盘子数不比苹果数多。
又可以分成两种情况:
1.全部放满。
要想全部放满,就要用plate个苹果先放满盘子。
2.有空盘子。
既然有空盘子,我们就需要将下次递归的盘子数减一,这样一直递归下去,无论少几个盘子都可以被递归到(每次减一,多减几遍就可以考虑到其他的数)。
所以
再看看递归边界。
递归边界有四个:,很显然,他们的答案都是1。
代码:
#include<iostream>
using namespace std;
int n,m;
int dfs(int apple,int plate){
if(apple<=1||plate<=1){
return 1;
}if(plate>apple){
return dfs(apple,apple);
}else{
return dfs(apple-plate,plate)+dfs(apple,plate-1);
}
}
int main(){
int t;
cin>>t;
while(t--){
cin>>n>>m;
cout<<dfs(n,m)<<endl;
}
return 0;
}