题目https://www.luogu.com.cn/problem/P2386
题目描述
把 mm 个同样的苹果放在 nn 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。(5,1,15,1,1 和 1,1,51,1,5 是同一种方法)
输入格式
第一行是测试数据的数目 tt,以下每行均包括二个整数 mm 和 nn,以空格分开。
输出格式
对输入的每组数据 mm 和 nn,用一行输出相应的结果。
输入输出样例
输入 #1复制
1 7 3
输出 #1复制
8
输入 #2复制
3 3 2 4 3 2 7
输出 #2复制
2 4 2
说明/提示
对于所有数据,保证:1\leq m,n\leq 101≤m,n≤10,0 \leq t \leq 200≤t≤20。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6;
int a[N];
int apple(int m,int n)//m是苹果数,n是盘子数
{
if(m==0||m==1||n==1)
//边界:当苹果只有一个或者没有苹果时或者盘子只有一个时,只有一种放法,所以达到边界,返回值;
return 1;
if(m<n)
//当苹果数少于盘子数,就只有m个盘子作用,所以接下来就计算m个苹果和m个盘子;
return apple(m,m);
//if(m>=n)//如果苹果数大于等于盘子数,分成两个部分,一种是目前所有的盘子都放一个苹果,另一种是拿一个盘子不放;
return apple(m-n,n)+apple(m,n-1);
}
signed main()
{
int t;
cin >> t;
while(t--){
int m,n;
cin >> m>> n;
cout<<apple(m,n)<<endl;
}
}