放苹果#洛谷#dfs#c语言

题目描述

把 m 个同样的苹果放在 n 个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。(5,1,1 和 1,1,5 是同一种方法)

输入格式

第一行是测试数据的数目 t,以下每行均包括二个整数 m 和 n,以空格分开。

输出格式

对输入的每组数据 m 和 n,用一行输出相应的结果。

输入输出样例

输入 #1复制

1
7 3

输出 #1复制

8

输入 #2复制

3
3 2
4 3
2 7

输出 #2复制

2
4
2

说明/提示

对于所有数据,保证:1≤m,n≤10,0≤t≤20。

这道题之前在学校oj刷题网站没过,当时初学,对什么都不熟,就想着找找规律,毕竟当时老师告诉我们的是递归就是找规律嘛,可怜我和的傻子一样日思夜想,都要成魔了呜呜呜呜,现在想想那时候真幼稚

这道题用dfs很简单,只是和一般的dfs题稍微不同的是他的循环是从大到小,因为要保证前一个盘子里的苹果大于等于这个盘子里的苹果数,防止出现5,1,1  ||1,5,1||1,1,5这样的重复数来

废话不多说,代码如下

#include
int n,m,y=0;
int sum=0;
int a[50]={100};
void dfs(int l)
{
    if(sum==n&&l==m+1)
    {
        y++;
        return;
    }
    for(int i=n;i>=0;i--)
    {
        a[l]=i;
        if(a[l]<=a[l-1]&&sum<=n&&l<=m)
        {
           // printf("%d  %d\n",a[l],l);
            sum=sum+a[l];
            l++;
            dfs(l);
            l--;
            sum=sum-a[l];
        }
    }
}
int main()
{
   int t;
   scanf("%d",&t);
   while(t>0)
   {
       scanf("%d %d",&n,&m);
       dfs(1);
       printf("%d\n",y);
       t--;
       sum=0;a[50]={100},y=0;
   }
}

你可能感兴趣的:(深度优先,c语言,算法)