非常有意思的一道智力题,搜索解决
#include <bits/stdc++.h>
using namespace std;
int t, n, m, asd, ans[11][11];
int dfs(int apple, int dish){
if(ans[apple][dish]!=0){ //记忆化搜索
return ans[apple][dish];
}
if(apple==1 || dish==1 || apple==0){ //apple等于0是盘子数和苹果数一样时,每个放一个的结果, 所以需要return 1
return ans[apple][dish]=1;
}
else if(dish>apple){ //当盘子数大于苹果数时, 对结果起作用的盘子只有apple个
return ans[apple][dish]=dfs(apple, apple);
}
else{ //每个盘子都放一个苹果, 有一个盘子不放苹果
return ans[apple][dish]=dfs(apple-dish, dish)+dfs(apple, dish-1);
}
}
int main()
{
scanf("%d", &t);
while(t--){
scanf("%d %d", &m, &n); //m表示苹果, n表示盘子
printf("%d\n", dfs(m, n));
}
return 0;
}