小蒜想知道把 M 个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,共有多少种不同的分法?(用 KK 表示)5,1,1 和 1,5,1 是同一种分法。
输入格式
第一行是测试数据的数目 t(0≤t≤20)。
以下每行均包含两个整数 M 和 N,以空格分开。 1≤M,N≤10。
输出格式
对输入的每组数据 M 和 N,用一行输出相应的 K。
输出时每行末尾的多余空格,不影响答案正确性
样例输入
1
7 3
样例输出
8
**我们先令dp(m,n)表示水果为m个,盘子为n个时的情况
可以分为两种情况
- m<n时说明水果的数量比盘子的数量少那么我们此时的dp(m,n)等价于dp(m,m) 因为盘子数量多与水果数量所以最多用m个盘子所以此时有dp(m,n)=dp(m,m)
- m>=n时 我们可以往每个盘子里面都放一个苹果也可以盘子减少一个然后再放苹果(或者继续减少)
此时有dp(m,n)=dp(m-n,n)+dp(m,n-1);**
上面解释的挺清楚了代码就不打注释了
#include<bits/stdc++.h>
using namespace std;
int dp(int m,int n){
if(n==1) return 1;
if(m==0) return 1;
if(m<n) return dp(m,m);
else {
return dp(m-n,n)+dp(m,n-1);
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d%d",&m,&n);
printf("%d\n",dp(m,n));
}
return 0;
}