华为机试HJ61:放苹果

Posted 翟天保Steven

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为机试HJ61:放苹果相关的知识,希望对你有一定的参考价值。

作者:Steven
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处

题目描述:

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

数据范围:0<=m<=10,1<=n<=10。

本题含有多组样例输入。

输入描述:

输入两个int整数

输出描述:

输出结果,int型

示例:

输入:

7 3

输出:

8

解题思路:

本题用递归和动态规划做。m个苹果放在n个盘子里,允许空盘,用function函数递归获得结果;当m或n小于等于0时,返回0;当m或n等于1时,返回1;当m和n都大于1时,function(m,n)其实可以分为两种情况,一是留一个空盘,即function(m,n-1),二是全满盘,每个盘先放一个苹果,即function(m-n,n),则有function(m,n)=function(m,n-1)+function(m-n,n),进入递归过程;其中当m等于n时,function(m,n)=function(m,n-1)+function(m-n,n)+1,因为此时的function(m-n,n)是function(0,n),而m和n一致时满盘的情况只有一种,就是每个盘子都放一个。综上,解题完毕。

测试代码:

#include <iostream>

using namespace std;

int function(int m,int n){
    if(m<=0 || n<=0)
        return 0;
    else if(m==1 || n==1)
        return 1;
    else if(m==n)
        return function(m,n-1)+function(m-n,n)+1;
    else 
        return function(m,n-1)+function(m-n,n);
}

int main(){
    int m,n;
    while(cin >> m >> n){
        cout << function(m,n) << endl;
    }
    return 0;
}

以上是关于华为机试HJ61:放苹果的主要内容,如果未能解决你的问题,请参考以下文章

华为机试HJ43:迷宫问题

华为机试HJ76:尼科彻斯定理

华为机试HJ99:自守数(附带提速方案)

华为机试HJ99:自守数(附带提速方案)

HJ61 放苹果

华为机试 HJ64 MP3光标位置