解题思路:
(1)把m个相同的苹果放到n个相同的盘子中,苹果和盘子都相同,要求方案数,说明顺序可以忽略,比如5个苹果放入3个盘子中,可以第一个放3个苹果,第二个三个盘子空,也可以第2个盘子放3个苹果,第1,3个盘子空,这是一种方案
(2)那么问题也就转化成了,求n个数的组合,要使他们的和为m,为组合问题,并且数字可以重复,而且可以为0(因为有空盘子),要求方案数不能重复的话,每次下一层的递归枚举的数字不能小于前一个数字
(3)设置一个dfs函数,dfs(0,0,1)第一个参数表示从0开始枚举,第二个参数0表示当前的苹果数量,第三个参数1为开始取第一个盘子,如果递归到n层,表示n个盘子都已经用完,判断累加器中的苹果数是否为m个,如果是,方案数加1
(4)在主函数for循环中,记得将方案数输出换行后清零
(5)由于数据量较小,不用清零,剪枝方法同本章第4题数的划分相同
#include<bits/stdc++.h>
using namespace std;
int m,n,num;
void dfs(int start,int sum,int cnt)//设置深搜函数
{
if(cnt>n)//如果取够了n个盘子,结束递归
{
if(sum==m)//如果n个盘子中的苹果数为m
num++;//方案数增加
return ;
}
for(int i=start;i<=m;i++)//每一次的递归枚举的数字都不小于上一层
{
dfs(i,sum+i,cnt+1);
}
}
int main()
{
int x;
cin>>x;
for(int i=1;i<=x;i++)
{
cin>>m>>n;
dfs(0,0,1);
cout<<num<<endl;
num=0;//方案数清零
}
return 0;
}