牛客华为机试HJ61题 《放苹果》

该问题是一个组合问题,涉及到动态规划和递归的思想。当苹果数量大于盘子时,只需考虑苹果数量等于盘子数量的情况。否则,分法包括每个盘子至少有一个苹果和至少一个盘子为空两种情况,可以通过递归公式f(m,n)=f(m-n,n)+f(m,n-1)计算。给出的Java代码实现了这个算法。
摘要由CSDN通过智能技术生成

HJ61

描述

把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?

注意:如果有7个苹果和3个盘子,(5,1,1)和(1,5,1)被视为是同一种分法。

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

输入描述:

输入两个int整数

输出描述:

输出结果,int型

示例1

输入:

7 3

复制输出:

8

小白分析

      因为题目的标签里有动态规划和递归,所以想往上靠,但动态规划是什么,好像是用穷举求最优解的方法;递归只知道一个汉洛塔问题,反正总觉得有些抽象。小白就是没思路加代码也不会写。

大神分析

思路清晰,代码清晰

1.当苹果数量大于盘子时,多余的盘子是没用的,那么问题就变成了把m个苹果放入m个盘子中

2.当苹果数量大于等于盘子时,又可以拆分成两种情况:

    1)每个盘子都放有苹果。每个盘子都放一个苹果后,就相当于把m-n个苹果放入n个盘子中。即求f(m-n,n)。

    2)至少有1个盘子没放入苹果。相当于将m个苹果放入n-1个盘子+...+把m个苹果放入n-(n-1)个盘子,即求f(m,n-1)+f(m,n-2)+...+f(m,n-(n-1))

(可以看到1(苹果数量大于盘子)和2(苹果数量大于等于盘子)是承接关系的,考虑第一种情况也是为了去掉多余的情况)

       为什么最终列式只有f(m,n-1)?因为我是用递归解的,递归过程中n逐渐减1,就包括了f(m,n-1)+f(m,n-2)+...+f(m,n-(n-1))的情况
最终当盘子数量为1或者苹果数量为0时停止递归

所以:

f(m,n)=f(m,m)  (n<m)

f(m,n)=f(m-n,n)+f(m,n-1) (n>=m)

代码 

import java.util.Scanner;
public class Main{
    public static void main(String[] args)
    {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNextInt())
        {
            System.out.println(count(sc.nextInt(),sc.nextInt()));
        }
        sc.close();
    }
    public static int count(int m,int n)
    {
        if(m<0||n<=0)
           return 0;
        //细分到苹果数为一或盘子数为一的情况返回一
        if(m==1||n==1||m==0)
            return 1;
        //将此事件无线细分
        return count(m,n-1)+count(m-n,n);
    }
}

chatgpt问答

     小白福音,不一定是最高质量的回答,但一定是能最理解你的回答。随问随答,能跟上你的思维。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值