题目描述

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。

输入描述:

每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

输出描述:

对输入的每组数据M和N,用一行输出相应的K。
示例1

输入

7 3

输出

8


解析:动态规划问题,
用递归方法解决
即把M分为N个数的和,可以有0,利用递归,当M等于1或者N等于1时只能有一种结果,当M小于0时,返回0;
其他情况:每次有一个是空盘子,即0,把M个苹果分为N-1份,依次递推;
再给每个盘子依次放一个苹果,将M-N个苹果放入N个盘子中;
上述两种情况并不冲突,所以可以相加。
#include<iostream>
using namespace std;
int fun(int M,int N)
{
    if(M==1||N==1)
        return 1;
    else if(M<0||N==0)
        return 0;
    else
        return fun(M,N-1)+fun(M-N,N);
}
int main()
{
    int M,N;
    while(cin>>M>>N)
    {
        cout<<fun(M,N)<<endl;
    }
    return 0;
}

 动态规划解决:

int main()
{
    
    int M,N;
    int a[100][100];
    while(cin>>M>>N)
    {
        for(int i=0;i<=M;i++)
        {
            
            a[i][1] = 1;
            a[i][0] = 0;
        }
        for(int i =0;i<=N;i++)
        {
            a[0][i]=1;
        }      
        for(int i=1;i<=M;i++)
        {
            for(int j=1;j<=N ;j++)
            {
                if(i<j)
                    a[i][j]=a[i][i];
                else
                    a[i][j]=a[i][j-1]+a[i-j][j];
            }
        }
        cout<<a[M][N]<<endl;
    }
    return 0;
}

 

posted on 2019-01-29 10:23  曹婷婷  阅读(148)  评论(0编辑  收藏  举报