题目链接:https://www.luogu.org/problemnew/show/P2386
题目描述
把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法)
输入输出格式
输入格式:
第一行是测试数据的数目t(0 <= t <= 20),以下每行均包括二个整数M和N,以空格分开。1<=M,N<=10
输出格式:
对输入的每组数据M和N,用一行输出相应的K。
输入输出样例
输出样例#2
2
4
2
解析
这道题和买书挺相似,针对每个盘子我们都可以放0-n个苹果,需要打个标记保证后面的数大于等于前面的数来去重。
代码
#include<bits/stdc++.h> using namespace std; int t; int m,n; int ans; void dfs(int last,int step,int now) { if(last==0&&step>n) { ans++; return; }//先判断合法 if(step>n) return; if(last==0) return;//提前返回,小剪枝 for(int i=now;i<=m;i++) { dfs(last-i,step+1,i); } } int main() { cin>>t; for(int i=1;i<=t;i++) { cin>>m >>n; dfs(m,1,0); cout<<ans<<endl; ans=0;//多组数据初始化 (重点) } return 0; }