华为机试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:放苹果的主要内容,如果未能解决你的问题,请参考以下文章