挖金矿问题

  • 使用递归的方式实现:

  • 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实现:挖金矿问题相关推荐

  1. java回调函数的生命_Java车票,车站,生命周期,龟兔赛跑,同步锁,礼让,守护线程,挖金矿【诗书画唱】...

    个人理解:加同步锁等的时候,就可以让线程"按顺序排队",一个一个地抢CPU,一个抢完对应的每次有的CPU了,另一个才抢对应的每次有的CPU,解决"并发"问题等. ...

  2. 百度上线百度金矿,个人电脑也可以挖金矿

    百度金矿号称一个可以让个人电脑利用闲置网络资源赚钱的软件,这种软件近几年好几家公司都有做过尝试,迅雷,小米等互联网公司都有搞过. 这种模式有点像比特币不过之前有试过迅雷的确实不太理想,百度金矿也只是 ...

  3. 人工智能变现难?这家AI挖金矿公司已上市

    "变现"是当下阶段人工智能公司面临最重要的难题,表面看来人工智能已经在安防.医疗.教育.智能手机.汽车.金融等诸多行业纷纷落地,但这些行业实际上能产生的营收并不十分乐观.而且诸多均 ...

  4. 46 道阿里巴巴 Java 面试题,你会几道?

    做技术的有一种资历,叫做通过了阿里的面试. 这些阿里Java相关问题,都是之前通过不断优秀人才的铺垫总结的,先自己弄懂了再去阿里面试,不然就是去丢脸,被虐. 希望对大家帮助,祝面试成功,有个更好的职业 ...

  5. java epoll select_最新阿里、拼多多、快手Java岗面试题269 道送答案

    Java面试,是对技术知识栈的梳理.考核.复盘 每一次Java面试,其实都是一次学习机会,是对自己技术知识栈的梳理.考核.复盘.我们应该抱着学习的态度,认真对待,找到自己比较薄弱的环节,尽快去查漏补缺 ...

  6. 【动态规划模型】金矿模型理解动态规划!(精彩的故事)

    对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划.本 ...

  7. 【转载】通过金矿模型介绍动态规划 (动态规划入门)

    先附上原文地址:http://www.cnblogs.com/sdjl/articles/1274312.html 通过金矿模型介绍动态规划 对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第 ...

  8. 阿里最全Java面试100题汇总:涵盖天猫、蚂蚁金服等面试题!含答案~

    [阿里天猫.蚂蚁.钉钉面试题目] 1.微信红包怎么实现. 2.海量数据分析. 3.测试职位问的线程安全和非线程安全. 4.HTTP2.0.thrift. 5.面试电话沟通可能先让自我介绍. 6.分布式 ...

  9. 动态规划入门之国王的金矿

    最近学习算法,对动态规划不太了解,使用的时候照搬转移方程式,知其然不知其所以然,今天看到一篇动态规划的教程,解释得非常通俗,原文在这里[动态规划入门教程] (http://blog.csdn.net/ ...

  10. Java程序员是如何面试上阿里巴巴,如何拿到年薪50W

    阿里java相关问题,都是之前通过不断优秀人才的铺垫总结的,希望对大家帮助,祝面试成功,有个更好的职业规划. 1.微信红包怎么实现. 2.海量数据分析. 3.测试职位问的线程安全和非线程安全. 4.H ...

最新文章

  1. R语言问题解决:Error: Discrete value supplied to continuous scale
  2. 海量数据库解决方案2011032301
  3. mysql, 一对多查询, 统计一表数量
  4. 网络推广外包——网络推广外包如何在搜索引擎中体现关键词优化效果
  5. Hadoop文件系统常用命令
  6. Galgame研发日志:预算爆炸,问题不大
  7. 堆排序的应用-优先级队列
  8. 0基础web开发 python_真零基础Python开发web
  9. xp怎么设置计算机共享的打印机共享的打印机共享,Windows XP系统如何快速设置共享打印机?...
  10. 后台管理怎样用html实现,后台管理实现
  11. 不用找,你想要的节日 节庆 节气展板展架模板素材都在这里
  12. 量子计算机物理装置的总称,量子到底是什么?解读量子世界以及量子的实际应用!...
  13. 福玛特机器人怎么开机_五一解放双手的选择 福玛特扫地机器人解救你
  14. 云计算基础(一)2022-3-21
  15. linux服务器忘记密码操作
  16. 教你识别QQ匿名聊天的人是谁
  17. Rabbitmq集群,镜像队列和分布式原理
  18. 人工神经网络文献综述,人工神经网络参考文献
  19. STM32CubeMX的正交编码器encoder
  20. 福州市油烟浓度在线监控系统在餐饮行业的实施与应用 大气污染防治 油烟污染监测 油烟在线监控系统解决方案(安科瑞-须静燕)

热门文章

  1. iOS系统与Windows电脑如何做到无线传输文件?
  2. 两万常用汉字的拼音+首字母缩写+unicode编码对照表
  3. Python flag用法
  4. 利用标准差剔除异常数据
  5. FYI | Neuro Workshop (Virtual)-Connectomics
  6. dangdang.com的故事
  7. html表格中间有空白,word文档表格中间出现空白怎么解决
  8. 三天搞定射频识别技术(一)1.3
  9. java关于时间的换算
  10. 计算机应用宣传传统文化,计算机应用工程系创建优秀传统文化特色班级侧记