苹果放盘子的问题(动态规划)

2024-03-11 01:20

本文主要是介绍苹果放盘子的问题(动态规划),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

牛客网

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

import java.util.*;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(sc.hasNext()){int m = sc.nextInt();int n = sc.nextInt();System.out.println(solve(m,n));}}public static int solve(int m, int n){// 入参校验 当只有一个苹果或一个盘子的时候 只有一种摆法if(m == 1 || n == 1){return 1;}if(m <= 0 || n <= 0){// 入参校验, 当没有苹果,或没有盘子的时候, 没法摆return 0;}int res =0;// step1for(int i = 0; i <= n; i++){res += notEmpty(m, n - i);}return res;}public static int notEmpty(int m, int n){if(n == 1) return 1;if(m == 1) return 1;if(m < n) return 0;if(m == n) return 1;// step2return solve(m - n , n);}
}

对本题中的step1 和 step2 进行详细分析.

本题中,主要采用动态规划的思路.将大问题拆分成小问题,最终小问题结果的和就是大问题的结果.在本题的拆分中,主要涉及到两个关键的拆分点, 第一: 拆分盘子. 第二: 拆分苹果.
  • step1 拆分盘子
    由step1 下的for循环显而易见, 是将盘子依次减少达到拆分的目的.
    1. 为什么盘子要逐渐减少?
      例: 假设当前有 5个 苹果 3个盘子. 则本题即为将5 个苹果放入 3个盘子中的问题.
      穷举列出所有结果:
第一个盘子第一二个盘子第三个盘子
500
410
320
311
221
	由表格分析, 可将大问题拆分为3种情况.- 5个苹果只放 1 个盘子- 5个苹果放且只放2个盘子- 5个苹果放且只放3个盘子这也是step2的拆分依据.
3. 盘子减少后的结果是否与原结果相同?根据上述分析可知, 盘子拆分后. 结果依然相同. 5个苹果随机放3个盘子. 与 上述3种情况相加的结果相同.
  • step2 拆分苹果
    如何拆分苹果?
    只举例分析一种(5个苹果放且只放两个盘子的情况)
    首先已知前提, 5个苹果必须放到两个盘子中(盘子中放几个苹果都可以,但是必须要有两个盘子中有苹果)。
    那么我们可以假设这两个盘子中已经各有1个苹果(为了满足已知前提)。
    则 我们还剩下三个苹果需要放到两个盘子中去。

    此时!!! 问题已经变成了三个苹果 两个盘子的问题。!!!!!!
    就是代码中的 return solve(m - n , n); 这个逻辑。

    你品, 你细品。 step2依赖于step1, 所以step2需要满足step1的前提。 同时,step2又将问题重新转换为更小的新的问题。 而更小的新的问题,又从step1重头来过。
    看这个代码需要理解这两个拆分的逻辑, 如果你能理解,那么豁然开朗。闭着眼睛都能解决这个问题。在这里插入图片描述

这篇关于苹果放盘子的问题(动态规划)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/796135

相关文章

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

关于跨域无效的问题及解决(java后端方案)

《关于跨域无效的问题及解决(java后端方案)》:本文主要介绍关于跨域无效的问题及解决(java后端方案),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录通用后端跨域方法1、@CrossOrigin 注解2、springboot2.0 实现WebMvcConfig

Go语言中泄漏缓冲区的问题解决

《Go语言中泄漏缓冲区的问题解决》缓冲区是一种常见的数据结构,常被用于在不同的并发单元之间传递数据,然而,若缓冲区使用不当,就可能引发泄漏缓冲区问题,本文就来介绍一下问题的解决,感兴趣的可以了解一下... 目录引言泄漏缓冲区的基本概念代码示例:泄漏缓冲区的产生项目场景:Web 服务器中的请求缓冲场景描述代码

Java死锁问题解决方案及示例详解

《Java死锁问题解决方案及示例详解》死锁是指两个或多个线程因争夺资源而相互等待,导致所有线程都无法继续执行的一种状态,本文给大家详细介绍了Java死锁问题解决方案详解及实践样例,需要的朋友可以参考下... 目录1、简述死锁的四个必要条件:2、死锁示例代码3、如何检测死锁?3.1 使用 jstack3.2

解决JSONField、JsonProperty不生效的问题

《解决JSONField、JsonProperty不生效的问题》:本文主要介绍解决JSONField、JsonProperty不生效的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录jsONField、JsonProperty不生效javascript问题排查总结JSONField

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

springboot加载不到nacos配置中心的配置问题处理

《springboot加载不到nacos配置中心的配置问题处理》:本文主要介绍springboot加载不到nacos配置中心的配置问题处理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录springboot加载不到nacos配置中心的配置两种可能Spring Boot 版本Nacos

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET