分金问题

  • 分金问题
  • 解题思路
  • 代码演示
  • 递归解法
  • 贪心算法专题

分金问题

一块金条切成两半,是需要花费和长度数值一样的铜板 比如长度为20的金条,不管怎么切都要花费20个铜板,一群人想整分整块金条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,整块金条长度为60,金条要分成10,20,30三个部分。 如果先把长度60的金条分成10和50,花费60;再把长度50的金条分成20和30,花费50;一共花费110铜板 但如果先把长度60的金条分成30和30,花费60;再把长度30金条分成10和20,花费30;一共花费90铜板 输入一个数组,返回分割的最小代价

解题思路

这题用贪心解法,具体证明,不需要证明,证明很麻烦,只说思路。
把数组里的数都放进小根堆里去,会从小到大排列好,然后每次弹出来两个,相加再放进去,重复这个过程,直到小根堆里只剩一个元素,停止,此时前面每次弹出数字的累加和,就是最小代价。

代码演示

 public static int splitGold(int[]arr){if (arr == null || arr.length == 0){return 0;}PriorityQueue<Integer> queue = new PriorityQueue<>();for (int a : arr){queue.add(a);}int ans  = 0;while (queue.size() > 1){int sum = queue.poll() + queue.poll();queue.add(sum);ans += sum;}return ans;}

递归解法

解题思路:
也是类似上面的过程,上面是用小根堆,对顺序重构了,得到出最优解了,如果用递归的暴力方法,我们可以不去排序,直接暴力计算所有可能性,拿出最优解。

代码演示:

  /*** 主方法调用* @param arr* @return*/public static int splitGoldD(int[]arr){if (arr == null || arr.length == 0){return 0;}return process(arr,0);}/*** 递归* @param arr* @param pre* @return*/public static int process(int[]arr,int pre){//这点和小根堆只剩一个元素停止是一个道理if (arr.length == 1){return pre;}int ans = Integer.MAX_VALUE;for (int i = 0; i < arr.length;i++){for (int j = i + 1; j < arr.length;j++){ans = Math.min(ans,process(mergeArr(arr,i,j),pre + arr[i] + arr[j]));}}return ans;}/*** 将两个下标的元素合并后,然后放在新数组最后一位。* @param arr* @param i* @param j* @return*/public static int[] mergeArr(int[]arr,int i,int j){int N = arr.length;int[] ints = new int[N - 1];int x = 0;for (int k = 0; k < N;k++){if (k != i && k != j ){ints[x++] = arr[k];}}ints[x] = arr[i] + arr[j];return ints;}

贪心算法专题

贪心算法-用最少的灯照亮所有街道
贪心算法-字符串数组能拼接出的最小字典序

贪心算法-分金问题,返回分割最小代价(java)相关推荐

  1. 分金问题 返回分割的最小代价 (贪心算法)

    一块金条切成两半,是需要花费和长度数值一样的铜板 比如长度为20的金条,不管怎么切都要花费20个铜板,一群人想整分整块金条,怎么分最省铜板? 例如,给定数组{10,20,30},代表一共三个人,整块金 ...

  2. 贪心算法---背包问题(物品可以分割问题)

    问题背景: 有一天,阿里巴巴赶着一头毛驴上山砍柴.砍好柴准备下山时,远处突然出现一股烟尘,弥漫着直向上空飞扬,朝他这儿卷过来,而且越来越近.靠近以后,他才看清原来是一支马队,他们共有四十人,一个个年轻 ...

  3. 贪心算法-分饼干问题

    1.题目描述 假设你是一位很棒的家长,想要给你的孩子们一些小饼干.但是,每个孩子最多只能给一块饼干.对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸:并且每块饼干 j ...

  4. 力扣455.分发饼干(java)-贪心算法思想及基本步骤

    文章目录 贪心算法核心思想 基本步骤 455.分发饼干(Java) 1.需要考虑的问题 2.方案(序号分别与问题对应) 贪心算法核心思想 贪心算法的基本思想是每一步都做出当时看起来最佳的选择,可以理解 ...

  5. Java蓝桥杯——贪心算法

    贪心算法 贪心算法:只顾眼前的苟且. 即在对问题求解时,总是做出在当前看来是最好的选择 如买苹果,专挑最大的买. 最优装载问题--加勒比海盗 货物重量:Wi={4,10,7,11,3,5,14,2} ...

  6. USACO-Section1.4 Mixing Milk (贪心算法)

    2017-5-27 题目描述 从拥有不同单价和库存牛奶的M个农场主手里买数量为N的牛奶的最小支出 解答 每次都选择单价最小的 代码 /* ID: 18795871 PROG: milk LANG: C ...

  7. 贪心算法最短路径java_贪心算法-单源最短路径

    算法思想:贪心算法 实际问题:单源最短路径 编程语言:Java 问题描述 单源最短路径算法,又称迪杰斯特拉算法.其目的是寻找从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题. 算法构 ...

  8. 海盗分金c语言算法,[经典算法]海盗分金问题sql求解(贪心算法)

    问题: 经济学上有个"海盗分金"模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,超过半数同意方案才被通过,否则他将被扔入大海喂 ...

  9. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

最新文章

  1. 用Select查询结果创建ACCESS表
  2. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 运行环境搭建 Android 模拟器安装 | 拷贝 Android 平台可执行文件和动态库到 /data/system )
  3. 【机器学习】半监督学习
  4. 一道十分有趣的概率题!3局2胜和5局3胜哪个胜算更大?你怎么思考
  5. django--通过model拿到字段对象
  6. so库文件控制导出符号
  7. bz1968 1968: [Ahoi2005]COMMON 约数研究
  8. 对于IDEA 导入eclipse项目后 没有办法启动部署 以及javax.servlet.http不存在
  9. 安卓9去掉搜索栏_android9.0隐藏虚拟按键跟状态栏,除去google搜索栏.
  10. 第一次作业 三班20
  11. matlab节约里程法_基于节约里程法的物流配送路线优化
  12. 保密协议中竞业限制未写明补偿金的是否可以生效?
  13. 华为云OBS数据桶使用
  14. update时 单行子查询返回多个行 SQL 错误 [1427] 处理方案
  15. Docker学习之三:docker镜像管理
  16. 京东云开放“技术百宝箱”,零售商家说今年618就靠它了!
  17. Linux上使用SafeNet加密exe文件
  18. 考研复试——通信原理专业课问答
  19. 复制粘贴出现乱码的解决
  20. beego保存数据库时间相差八小时 8小时问题解决

热门文章

  1. 语音识别预训练模型Hidden-Unit BERT (HuBERT)
  2. (一)transforms的使用
  3. 计算机网络复习(下)
  4. yum.conf 配置文件详解
  5. vue elementUi邮箱列表选择(全选,已读,未读,删除)功能
  6. 远程办公,即将开启企业办公的全新时代!
  7. 双子星tv源码_云水日记-双子星IPTV管理系统搭建教程
  8. 北京“新基建”方案发布 八大关键词全方位解析
  9. 解决办法:无法从本地电脑复制文件到远程服务器中
  10. 【报告分享】2021抖音数据报告-巨量算数(附下载)