题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。
输入格式
第一行是测试数据的数目t(0<=t<=20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。
输出格式
对输入的每组数据M和N,用一行输出相应的K。
样例输入
1 7 3
样例输出
8
问题分析
m(苹果数)、n(盘子数)
问题中可以有空盘子,所以我们要考虑的方法中就要分为有空盘和无空盘两种情况
当m<n时,无论如何放都至少有n-m个空盘,所以直接缩范围,考虑临界情况-->勉强放满时,此时值为dfs(m,m);
当m>=n时,是否空盘是可控的,此时放法就等于:空盘子的方法+放满的方法,也就是
dfs(m,n-1)+dfs(m-n,n),
dfs(m,n-1),每次空一个盘·,递归计算所有空盘的方法。
dfs(m-n,n),先取出n个苹果在n个盘子各放一个,防止空盘。对剩余m-n个进行计算。
代码
#include<bits/stdc++.h>
using namespace std;
int sum;
int dfs(int m,int n)
{
if(n>m) return dfs(m,m);
if(m==0) return 1;
if(n<=0) return 0;
return dfs(m,n-1)+dfs(m-n,n);
}
int main()
{
ios::sync_with_stdio(false);
sum=0;
int t;
cin>>t;
while(t--)
{
int m,n;//m苹果数,n盘子数
cin>>m>>n;
cout<<dfs(m,n)<<endl;
}
return 0;
}