• 放苹果


    题目描述

    把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;
    }
  • 相关阅读:
    数据包发送
    linux 进程调度3
    linux 进程调度2
    linux 进程调度1
    进程间通信:信号
    fork vfork clone学习
    跳表
    【转】Linux内存管理综述
    如何优雅的写出链表代码
    This function or variable may be unsafe Consider using xxx instead
  • 原文地址:https://www.cnblogs.com/ttzz/p/10330915.html
Copyright © 2020-2023  润新知