华为机试HJ61:放苹果

简介: 华为机试HJ61:放苹果

题目描述:

把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;
}


相关文章
poj 1164 放苹果
这题可以用递归的方式做,想给第一个盘子里放上苹果从(0到m),然后给第二个放上,为了保证每次产生的放法是不同的,第二个里面放置的苹果不能从0开始,否则就会产生相同的放法,然后同理第三第四个盘子。。。。 还有一个问题,可能放到最后一个盘子了,还有很多苹果没有放,怎么办?
47 0
|
6月前
|
C++
【PTA】L1-019 谁先倒 (C++)
【PTA】L1-019 谁先倒 (C++)
83 0
【PTA】L1-019 谁先倒 (C++)
|
测试技术
华为机试HJ77:火车进站
华为机试HJ77:火车进站
127 1
华为机试HJ105:记负均正II
华为机试HJ105:记负均正II
119 1
|
Serverless 测试技术
华为机试HJ97:记负均正
华为机试HJ97:记负均正
130 1
华为机试HJ95:人民币转换
华为机试HJ95:人民币转换
130 1
|
机器学习/深度学习 测试技术
华为机试HJ55:挑7
华为机试HJ55:挑7
华为机试HJ88:扑克牌大小
华为机试HJ88:扑克牌大小
105 0
|
机器学习/深度学习 算法 数据安全/隐私保护
华为机试HJ28:素数伴侣
华为机试HJ28:素数伴侣
103 0
|
测试技术
华为机试HJ24:合唱队
华为机试HJ24:合唱队
100 0