放苹果
题目描述
把 $m$ 个同样的苹果放在 $n$ 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。($5,1,1$ 和 $1,1,5$ 是同一种方法)
输入格式
第一行是测试数据的数目 $t$,以下每行均包括二个整数 $m$ 和 $n$,以空格分开。
输出格式
对输入的每组数据 $m$ 和 $n$,用一行输出相应的结果。
样例 #1
样例输入 #1
1
7 3
样例输出 #1
8
样例 #2
样例输入 #2
3
3 2
4 3
2 7
样例输出 #2
2
4
2
提示
对于所有数据,保证:$1\leq m,n\leq 10$,$0 \leq t \leq 20$。
算法1
(递归)
分类讨论
1.当苹果的数量 > 盘子的数量时
-
把所有盘子上放一个苹果 return apple(n-m,m);
-
去掉一个盘子 return apple(n,m-1);
2.苹果数量(n) < 盘子数量(m)
这时候只有 n 个盘子起作用 return apple(n,n);
自己手动模拟一下就懂了
C++ 代码
#include <bits/stdc++.h>
using namespace std;
int T,n,m;
int apple(int n,int m){ //n个苹果,m个盘子
if(n==0||n==1||m==1) return 1;
if(n<m) //如果苹果数小于盘子数量时,只有n个盘子起作用
return apple(n,n);
if(n>=m) //有两种
return apple(n-m,m) + apple(n,m-1);
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
printf("%d\n",apple(n,m));
}
return 0;
}