计蒜客 T1208-递归
前言
一道DFS()的水题;
一个盘子一个盘子算,有一定规律,多待两个数就看出来了。
一、题目
小蒜想知道把 M个同样的苹果放在 N 个同样的盘子里,允许有的盘子空着不放,共有多少种不同的分法?(用 K表示)5,1,1 和 1,5,1 是同一种分法。
输入格式
第一行是测试数据的数目
t(0≤t≤20)。
以下每行均包含两个整数
M 和 N,以空格分开。1≤M,N≤10。
输出格式
对输入的每组数据 M和 N用一行输出相应的 K。
Sample Input
1
7 3
Sample Output
8
# 二、代码
#include<math.h>
using namespace std;
long long sum=0,n,m;
const int INF=0x3f3f3f3f;
long long dfs(long long h,long long x,long long p){
long long a=0,i,b=0;
if(p<=0){
return 0;
}
if((x-1)<0){
x=1;
}
for(i=h;i>(x-1)/p;i--){
if(p<m&&i==h){
sum--;
}
sum++;
if((x-i)>i){
a=i;
}else{
a=x-i;
}
b=p-1;
dfs(a,(x-i),b);
}
}
long long x[1000000];
int main()
{
long long t;
char o;
scanf("%lld",&t);
while(t--){
long long i,a=1,b=0,p,f=0,h,c=0,j,d=-INF;
scanf("%lld%lld",&n,&m);
dfs(n,n,m);
printf("%lld\n",sum);
sum=0;
}
return 0;
}
# 总结
DFS水题,博主只打过两道,所以代码比较长。