JAVA 用分苹果来理解本题
思路
其实这是一道非常经典的分苹果问题:
有m个一样的苹果和n个一样的盘子,把苹果放盘子里,每个盘子允许0-m个苹果,求问有多少种分法?
与本题的共通之点在于,输入的正整数可以看成m个苹果,拆分出的加数个数可以看成n个盘子,例如:4 = 1 + 1 + 3,可以看成4个苹果分到3个盘子中的一种情况。
为了更好地理解,我们继续回到分苹果问题上。
我们假设分苹果的结果由这样一个函数得出:f(m, n)
思考一种特殊情况:如果只有1个苹果,或者只有1个盘子,无论怎么折腾是不是只有1种分法?
至此我们就轻松找到了递归解法的出口,也找到了动态规划的base。
但是注意,我们这里原题是拆分整数,理论上整数可以为0,拆分的个数也可以为0,我们把这种情况也划分进去(主要是为了更方便处理动态规划的数组,后面会说),转换成代码即为:
if m <= 1 or n <= 1:f(m,n) = 1;
再考虑m<n的情况,盘子比苹果多得多,那我把多余的盘子拿走也不会有任何影响:
if m < n:f(m,n) = f(m, m)
再考虑最后一种情况m>=n,苹果比盘子多或者和盘子一样多,可以由2种场景涵盖:
①不存在空盘子。我先把每个盘子都放上1个苹果,就不存在空盘子啦,然后继续分我的苹果:
f(m - n, n)
②存在空盘子。有空盘子存在,换种说法至少让1个盘子为空,那我先把这个空盘子拿出来,然后继续分我的苹果:
f(m, n - 1)
以上2种情况转换为代码即为:
if (m >= n):f(m, m) = f(m - n, n) + f(m, n - 1)
最后这种情况为啥能等效,可能要花点力气去理解。
代码
现在我们可以开始撸代码了,先上递归解法:
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int num = sc.nextInt();System.out.println(cal(num, num));}}private static int cal(int m, int n) {if (m <= 1 || n == 1) {return 1;}if (m < n) {return cal(m, m);} else {return cal(m - n, n) + cal(m, n - 1);}}}
但是递归解法自顶向下,效率很低,如果画一下递归调用栈,会发现存在大量的重复计算,提交也会超时。。。
这时候就可以用动态规划来解,同样的思路,只不过是反过来自底向上。
用一个二维数组来存放每次的计算结果,以方便复用,而这个数组的base就是当i、j小于等于1的时候,arr[i][j]=1:
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int num = sc.nextInt();System.out.println(dp(num, num));}}private static int dp(int m, int n) {int[][] arr = new int[m + 1][n + 1];for (int i = 0; i <= m; i++) {for (int j = 0; j <= n; j++) {if (i <= 1 || j <= 1) {arr[i][j] = 1;} else if (i < j) {arr[i][j] = arr[i][i];} else {arr[i][j] = arr[i - j][j] + arr[i][j - 1];}}}return arr[m][n];}}
提交一下,完美通过。
JAVA 用分苹果来理解本题的更多相关文章
- Java实现 蓝桥杯VIP 算法训练 猴子分苹果
问题描述 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果.第一只猴子悄悄来到山洞,把苹果平均分成n份,把剩下的m个苹果吃了,然后藏起来一 ...
- Java实现 蓝桥杯VIP 算法提高 分苹果
算法提高 分苹果 时间限制:1.0s 内存限制:256.0MB 问题描述 小朋友排成一排,老师给他们分苹果. 小朋友从左到右标号1-N.有M个老师,每次第i个老师会给第Li个到第Ri个,一共Ri-Li ...
- 蓝桥杯 算法训练 ALGO-121 猴子分苹果
算法训练 猴子分苹果 时间限制:1.0s 内存限制:256.0MB 问题描述 秋天到了,n只猴子采摘了一大堆苹果放到山洞里,约定第二天平分.这些猴子很崇拜猴王孙悟空,所以都想给他留一些苹果 ...
- 【转】关于Java的Daemon线程的理解
原文地址:http://www.cnblogs.com/ChrisWang/archive/2009/11/28/1612815.html 关于Java的Daemon线程的理解 网上对Java的Dae ...
- COJN 0583 800602分苹果
800602分苹果 难度级别:B: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放, ...
- Java内存管理的进一步理解-模拟过程图解
Java内存管理的进一步理解-模拟过程图解--转载 java的内存管理分为: 1.堆内存:2.栈内存:3.方法区:4.本地方法区 /* 1:方法区 方法区存放装载的类数据信息包括: ...
- C语言 · 分苹果
算法提高 分苹果 时间限制:1.0s 内存限制:256.0MB 问题描述 小朋友排成一排,老师给他们分苹果. 小朋友从左到右标号1..N.有M个老师,每次第i个老师会给第Li个到第R ...
- java 重写你可以这么理解 因为 方法名和参数类型个数相同 所以这就是重写了 然后 因为是重写 所以 返回值必须相同
java 重写你可以这么理解 因为 方法名和参数类型个数相同 所以这就是重写了 然后 因为是重写 所以 返回值必须相同
- Java中线程同步的理解 - 其实应该叫做Java线程排队
Java中线程同步的理解 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Thread)是一份独立运行的程序,有自己专用的运行栈.线程有可 ...
- Java ClassLoader加载机制理解 实际例子
针对 Java ClassLoader加载机制理解, 做了个如何自定制简单的ClassLoader,并成功加载指定的类. 不废话,直接上代码. package com.chq.study.cl; im ...
随机推荐
- 全网最简单的大文件上传与下载代码实现(React+Go)
前言 前段时间我需要实现大文件上传的需求,在网上查找了很多资料,并且也发现已经有很多优秀的博客讲了大文件上传下载这个功能. 我的项目是个比较简单的项目,并没有采用特别复杂的实现方式,所以我这篇文章的目 ...
- 放弃 Electron,拥抱 WebView2!JavaScript 快速开发独立 EXE 程序
Electron 不错,但也不是完美的. Electron 带来了很多优秀的桌面软件,但并不一定总是适合我们的需求. 多个选择总是好事! 我使用 Electron 遇到的一些麻烦 1.Electron ...
- 正点原子keilkill脚本
del *.bak /s del *.ddk /s del *.edk /s del *.lst /s del *.lnp /s del *.mpf /s del *.mpj /s del *.obj ...
- [Python]-tqdm模块-给for循环加上进度条
import tqdm 使用tqdm模块,可以在漫长的for循环加上一个进度条,显示当前进度百分比. 将tqdm写在迭代器之外即可:tqdm(iterator) for i in tqdm(range ...
- 延申三大问题中的第一个问题处理---原先shell脚本中启动jar文件命令的配置,附加参数等
经过一系列的试错,最终采用的解决办法如下: 采用的配置文件 附加的启动参数 或者把这些都给统一添加到ConfigMap中
- Grafana配置Alert监控告警
1.添加告警途径 这里以slack为例 测试是否可用 在slack上收到告警通知了 安装插件 # grafana-cli plugins install grafana-image-renderer ...
- ExecutorService、Callable、Future实现有返回结果的多线程原理解析
原创/朱季谦 在并发多线程场景下,存在需要获取各线程的异步执行结果,这时,就可以通过ExecutorService线程池结合Callable.Future来实现. 我们先来写一个简单的例子-- pub ...
- 2_jQuery
一. jQuery介绍 1.1 什么是jQuery jQuery, 顾名思义, 也就是JavaScript和查询(Query), 它就是辅助JavaScript开发的js类库 1.2 jQuery核心 ...
- vue通过插件实现PDF生成以及下载
第一步: 安装插件 npm install --save html2canvas //将html转换成图片 npm install jspdf --save //将图片生成pdf 第二步: 在需要的地 ...
- 洛谷P5788 单调栈(模板)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=3e6+10; 4 int n,a[N],s[N],ans[N ...