dp专题:分梨

分梨

题目描述
小明非常喜欢吃梨,有一天他得到了ACMCLUB送给他的一筐梨子。由于他比较仗义,就打算把梨子分给好朋友们吃。现在他要把M个梨子放到N个盘子里面(我们允许有的盘子为空),你能告诉小明有多少种分法吗?(请注意,例如有三个盘子,我们将5,1,1和1,1,5,视为同一种分法)
输入
输入包含多组测试样例。每组输入的第一行是一个整数t。
接下来t行,每行输入两个整数M和N,代表有M个梨和N个盘子。(M和N均大于等于0)
输出
对于每对输入的M和N,输出有多少种方法。
样例输入
1
7 3
样例输出
8

题目解析:
这道题在做之前我知道大概怎么做,但是想了很久还是没有归纳出来到底怎么放,最后怎么放归纳为一下几点:

(1):如果只有一个盘子,无论有多少水果都是一种放法,(没有水果也算一种,不存在没有盘子的情况);
(2):如果没有水果,无论有多少盘子都是一种放法;
(3):如果有盘子比水果多,那就相当于多余的盘子永远放不了,无论怎么放产生的都是已有放法,所以它的盘子熟等于水果数的放法;
(4)如果水果比盘子多,而且题目也说了,可以有的盘子为空,所以它的放法可以分为二种放法之和,也就是全部放有水果的盘子的一种和并不是全部放有水果的盘子的一种;

#include

int main()
{
    int t;
    while(scanf("%d",&t)!=EOF)
    {
        while(t--)
        {
            int x,y;
            scanf("%d%d",&x,&y);    
            int a[x+1][y+1];
            for(int i=0;i<=x;i++)
                a[i][1]=1;
            for(int i=0;i<=y;i++)
                a[0][i]=1;
            for(int i=2;i<=y;i++)
                for(int j=1;j<=x;j++)
                {
                    if(i<=j)
                        a[j][i]=a[j-i][i]+a[j][i-1];
                    else
                        a[j][i]=a[j][j];
                }

            printf("%d\n",a[x][y]);     
        }

    }

}

你可能感兴趣的:(dp专题)