当前位置: 首页 > news >正文

算法.动态规划.最少钱币数问题(Java,递归)

问题

有11,5,1 三种币值 要凑15块钱 问题:求 钱的张数最小

贪婪法

1. 贪婪法:先用最大的,然后依次,最后用1块做填补 - 如果W比任何一张币值大,且一定可以补够,比如有1块就可以 - 特例: 1. w没有币值大 2. 比如:11,5,3 选11 就凑不够15块,也就是说 先选最大币值未必能拼够 3. 贪婪算法 一般情况下都不是最优解, 只有大面值可以覆盖所有小面值,这种方案才能得到最优解,比如:100,50,10,5,1就可以

动态规划法

动态规划方法 拼凑15块钱,需要最小的钱的张数,称为F(15) 那么: F(15) = Min( F(15-11) + 1, F(15-5) + 1, F(15-1) + 1 ) = Min( F(4) , F(10) , F(14) ) + 1 F(10) = Min( F(10-11) + 1, F(10-5) + 1, F(10-1) + 1) = Min( F(-1) , F(5) , F(9) )+ 1 = Min( F(5) , F(9) )+ 1 = Min( 1 , F(9) )+ 1 说明: F(4)+1 : 用了一张11块币值,剩余需要凑4块的钱的张数 F(5) : 凑跟币值一样的钱数,当然是直接使用一张5块的就算完事 F(10): 凑10块 可以选:5,也可以选1块。 这个还按照贪婪从大到小,当然还需要比对。 - 优化点:咱看到5的下一级只需要取5块,2张就完事。 就没必要:5+1+1+1+1+1 直到最后 类似问题: 1. 第n个元素的值:F(n) = F(n-2) + (n-1) - n=1,2为2,3 2. 导航问题:假设A-Z导航,A后两条出口B,C - Min(a,z) = Min( (A-B) + Min(B,Z) ,(A-C) + Min(C,Z) ) 编码:递归,这类问题用递归 跟问题分析很对应

代码(Java)

@Test public void test1(){ // 有11,5,1 三种币值 int [] currencyValues =new int[]{11,5,1}; // 要凑15块钱 int w = 15; // 问题:求 钱的张数最小 Solution Solution = new Solution(); Assert.assertEquals(3, Solution.miniNumberOfMoney(currencyValues,w)); Assert.assertEquals(2, Solution.miniNumberOfMoney(new int[]{11,5,1},6)); // 这种就是无解场景 Assert.assertEquals(2, Solution.miniNumberOfMoney(new int[]{11,5,2},6)); } /** * 动态规划方法 * 拼凑15块钱,需要最小的钱的张数,称为F(15) * 那么: * F(15) = Min( F(15-11) + 1, F(15-5) + 1, F(15-1) + 1 ) * = Min( F(4) , F(10) , F(14) ) + 1 * * F(10) = Min( F(10-11) + 1, F(10-5) + 1, F(10-1) + 1) * = Min( F(-1) , F(5) , F(9) )+ 1 * = Min( F(5) , F(9) )+ 1 * = Min( 1 , F(9) )+ 1 * 说明: * F(4)+1 : 用了一张11块币值,剩余需要凑4块的钱的张数 * F(5) : 凑跟币值一样的钱数,当然是直接使用一张5块的就算完事 * F(10): 凑10块 可以选:5,也可以选1块。 这个还按照贪婪从大到小,当然还需要比对。 * - 优化点:咱看到5的下一级只需要取5块,2张就完事。 就没必要:5+1+1+1+1+1 直到最后 * * 类似问题: * 1. 第n个元素的值:F(n) = F(n-2) + (n-1) * - n=1,2为2,3 * 2. 导航问题:假设A-Z导航,A后两条出口B,C * - Min(a,z) = Min( (A-B) + Min(B,Z) ,(A-C) + Min(C,Z) ) * * 编码:递归,这类问题用递归 跟问题分析很对应 */ class Solution { public int miniNumberOfMoney(int[] moneys,int w) { int miniNum = Integer.MAX_VALUE; int tempMiniNum = 0; for(int i = 0 ; i < moneys.length ; i++){ if(moneys[i] > w){ // 拼凑的钱直接比当前币值小,比如拼凑99块,100面值就直接过了。 continue; }else if(moneys[i] == w){ // 拼凑的钱 跟 比当前币值相等,那么最新少的就是一张 tempMiniNum = 1; }else if(moneys[i] < w){ tempMiniNum = miniNumberOfMoney(moneys,w - moneys[i]) + 1; } // 如果这种币值的钱张数 比较少就记录 if(tempMiniNum < miniNum){ miniNum = tempMiniNum; } } return miniNum; } }

end

http://www.cnnetsun.cn/news/3371370.html

相关文章:

  • 2021 年开源 SLAM 算法集锦
  • 计算机毕业设计之基于SpringBoot框架的天气预报系统的设计与实现
  • list stream sort Comparator.nullsLast 避免空指针的正确用法
  • 数据库设计范式
  • 炉石传说终极自动化脚本:如何让日常任务效率提升73%
  • Fast-GitHub:网络边界革命,重塑中国开发者的GitHub体验
  • 从“AI辅助”到“AI共生”:一位特级教师用ChatGPT重构整学期大纲的真实日志(含每日Prompt迭代记录+学生反馈原始数据)
  • 如何在openEuler开源之夏项目中配置NFS存储与Kubernetes持久化存储
  • ct-oval 代码架构解析:深入理解安全漏洞扫描工具的模块化设计
  • 终极IPXWrapper指南:让Windows 10/11完美运行经典游戏联机
  • 5个核心功能:StreamFX完整指南 - 为OBS Studio打造专业级视觉效果
  • 工程结算技巧,吃透了够你用到老
  • OSS Browser:阿里云对象存储的桌面级管理革命
  • Flink CDC架构深度解析:构建企业级实时数据集成的最佳实践
  • 开发者必看:Earthdata Search本地部署与开发环境搭建指南
  • OnscripterYuri入门教程:如何快速在浏览器中运行视觉小说游戏
  • 纯NumPy手写计算图:从零构建可调试神经网络
  • ct-oval 社区贡献指南:如何参与项目开发和改进
  • python中的数据类型篇_1
  • 3分钟永久激活Windows和Office:KMS智能激活工具完全指南
  • Windows 7虚拟机安装VMware Tools受阻?深入解析VMCI驱动与SHA-2签名冲突的根源与解决之道
  • Keras-MMoE源码解读:深入理解MMoE层的实现细节和数学原理
  • B站视频下载神器:免费解锁大会员4K与充电专属内容
  • 主动学习实战:Awesome open data-centric AI框架提升标注效率
  • 计算机小程序毕设实战-面向海产品行业的产销信息化管理系统的设计与实现 海产品加工流程管控与线上销售平台的设计与实现【完整源码+LW+部署说明+演示视频,全bao一条龙等】
  • OpenGL 入门(一)—— 从零构建你的第一个着色器程序
  • unrpyc:5个步骤轻松掌握Ren‘Py脚本反编译工具完整指南
  • RedisFullCheck 与 RedisShake 集成:数据迁移后的完整性验证最佳实践
  • 如何用RVC语音转换工具打造专属AI歌手:5步快速上手完整指南
  • ChatGPT输出格式总翻车?这5个隐藏参数比temperature更重要(实测降低97.3%格式错误率)