Java实现:挖金矿问题
挖金矿问题
使用递归的方式实现:
public class text{/*** 获得金矿最优受益* @param: w 工人数量* @param: n 可选金矿数量* @param: p[] 金矿开采所需的工人数量* @param: g[] 金矿储量*/public static void main(String[] args) {int w=10;int[] p={5,5,3,4,3};int[] g={400,500,200,300,350};System.out.println("最优受益:"+getBestGoldMining(w,g.length,p,g));}private static int getBestGoldMining(int w, int n, int[] p, int[] g) {//当可选的金矿为0 或者 工人数为0if (w==0 || n==0){return 0;}//当工人的数量不足以满足当前这座金矿需要的工人时if (w<p[n-1]){return getBestGoldMining(w,n-1,p,g);}return Math.max(getBestGoldMining(w,n-1,p,g),getBestGoldMining(w-p[n-1],n-1,p,g)+g[n-1]);} }
- 递归的方式可能不太好理解,其实就是把你要的结果分成一个小的结果,类似于二叉树的方式,从叶子结点找到根节点就是我们要的值,这种方式不好理解,那么我换一种方式
使用二维数组的方式:
- 表格的横坐标是工人数在代码中用 w 表示,纵坐标是金矿储量在代码中用g数组表示
public class text{/*** 获得金矿最优受益* @param: w 工人数量* @param: n 可选金矿数量* @param: p[] 金矿开采所需的工人数量* @param: g[] 金矿储量*/public static void main(String[] args) {int w=10;int[] p={5,5,3,4,3};int[] g={400,500,200,300,350};System.out.println("最优受益:"+getBestGoldMining(w,p,g));}private static int getBestGoldMining(int w, int[] p, int[] g) {//1、创建二维数组int[][] resultTable=new int[g.length+1][w+1];//填充表格//代码中有两层循环第一个 for 循环每座金矿的储量//按照一行一行循环,对于二维数组for (int i=1;i<g.length+1;i++){//第二个 for 循环工人数for (int j=1;j<w+1;j++){//当前这座金矿不满足开采人数时,那么把当前值的前一个位置的值赋给当前值if (j<p[i-1]){resultTable[i][j]=resultTable[i-1][j];}else { //满足开采人数//resultTable[i-1][j]:当前位置的上头顶的那个元素//resultTable[i-1][j-p[i-1]]+g[i-1]:这一行是找到上一步的局部最优解resultTable[i][j]=Math.max(resultTable[i-1][j],resultTable[i-1][j-p[i-1]]+g[i-1]);}}}return resultTable[g.length][w];} }
改进二维数组:
- 降低空间复杂度到O(n)
public class text{/*** 获得金矿最优受益* @param: w 工人数量* @param: n 可选金矿数量* @param: p[] 金矿开采所需的工人数量* @param: g[] 金矿储量*/public static void main(String[] args) {int w=10;int[] p={5,5,3,4,3};int[] g={400,500,200,300,350};System.out.println("最优受益:"+getBestGoldMining(w,p,g));}private static int getBestGoldMining(int w, int[] p, int[] g) {//1、创建结果数组int[] results=new int[w+1];//2、填充一维数组for (int i=1;i<g.length+1;i++){for (int j=w;j>0;j--){if (j>=p[i-1]){results[j]=Math.max(results[j],results[j-p[i-1]]+g[i-1]);}}}//3、返回数组最后一个位置的值return results[w];} }
Java实现:挖金矿问题相关推荐
- java回调函数的生命_Java车票,车站,生命周期,龟兔赛跑,同步锁,礼让,守护线程,挖金矿【诗书画唱】...
个人理解:加同步锁等的时候,就可以让线程"按顺序排队",一个一个地抢CPU,一个抢完对应的每次有的CPU了,另一个才抢对应的每次有的CPU,解决"并发"问题等. ...
- 百度上线百度金矿,个人电脑也可以挖金矿
百度金矿号称一个可以让个人电脑利用闲置网络资源赚钱的软件,这种软件近几年好几家公司都有做过尝试,迅雷,小米等互联网公司都有搞过. 这种模式有点像比特币不过之前有试过迅雷的确实不太理想,百度金矿也只是 ...
- 人工智能变现难?这家AI挖金矿公司已上市
"变现"是当下阶段人工智能公司面临最重要的难题,表面看来人工智能已经在安防.医疗.教育.智能手机.汽车.金融等诸多行业纷纷落地,但这些行业实际上能产生的营收并不十分乐观.而且诸多均 ...
- 46 道阿里巴巴 Java 面试题,你会几道?
做技术的有一种资历,叫做通过了阿里的面试. 这些阿里Java相关问题,都是之前通过不断优秀人才的铺垫总结的,先自己弄懂了再去阿里面试,不然就是去丢脸,被虐. 希望对大家帮助,祝面试成功,有个更好的职业 ...
- java epoll select_最新阿里、拼多多、快手Java岗面试题269 道送答案
Java面试,是对技术知识栈的梳理.考核.复盘 每一次Java面试,其实都是一次学习机会,是对自己技术知识栈的梳理.考核.复盘.我们应该抱着学习的态度,认真对待,找到自己比较薄弱的环节,尽快去查漏补缺 ...
- 【动态规划模型】金矿模型理解动态规划!(精彩的故事)
对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本 ...
- 【转载】通过金矿模型介绍动态规划 (动态规划入门)
先附上原文地址:http://www.cnblogs.com/sdjl/articles/1274312.html 通过金矿模型介绍动态规划 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第 ...
- 阿里最全Java面试100题汇总:涵盖天猫、蚂蚁金服等面试题!含答案~
[阿里天猫.蚂蚁.钉钉面试题目] 1.微信红包怎么实现. 2.海量数据分析. 3.测试职位问的线程安全和非线程安全. 4.HTTP2.0.thrift. 5.面试电话沟通可能先让自我介绍. 6.分布式 ...
- 动态规划入门之国王的金矿
最近学习算法,对动态规划不太了解,使用的时候照搬转移方程式,知其然不知其所以然,今天看到一篇动态规划的教程,解释得非常通俗,原文在这里[动态规划入门教程] (http://blog.csdn.net/ ...
- Java程序员是如何面试上阿里巴巴,如何拿到年薪50W
阿里java相关问题,都是之前通过不断优秀人才的铺垫总结的,希望对大家帮助,祝面试成功,有个更好的职业规划. 1.微信红包怎么实现. 2.海量数据分析. 3.测试职位问的线程安全和非线程安全. 4.H ...
最新文章
- R语言问题解决:Error: Discrete value supplied to continuous scale
- 海量数据库解决方案2011032301
- mysql, 一对多查询, 统计一表数量
- 网络推广外包——网络推广外包如何在搜索引擎中体现关键词优化效果
- Hadoop文件系统常用命令
- Galgame研发日志:预算爆炸,问题不大
- 堆排序的应用-优先级队列
- 0基础web开发 python_真零基础Python开发web
- xp怎么设置计算机共享的打印机共享的打印机共享,Windows XP系统如何快速设置共享打印机?...
- 后台管理怎样用html实现,后台管理实现
- 不用找,你想要的节日 节庆 节气展板展架模板素材都在这里
- 量子计算机物理装置的总称,量子到底是什么?解读量子世界以及量子的实际应用!...
- 福玛特机器人怎么开机_五一解放双手的选择 福玛特扫地机器人解救你
- 云计算基础(一)2022-3-21
- linux服务器忘记密码操作
- 教你识别QQ匿名聊天的人是谁
- Rabbitmq集群,镜像队列和分布式原理
- 人工神经网络文献综述,人工神经网络参考文献
- STM32CubeMX的正交编码器encoder
- 福州市油烟浓度在线监控系统在餐饮行业的实施与应用 大气污染防治 油烟污染监测 油烟在线监控系统解决方案(安科瑞-须静燕)