news 2026/7/14 13:18:02

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法.动态规划.最少钱币数问题(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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 13:17:53

2021 年开源 SLAM 算法集锦

1. TANDEM: Tracking and Dense Mapping in Real-time using Deep Multi-view Stereo慕尼黑工业大学 Daniel Cremers 团队&#xff0c;实时单目跟踪稠密建图纯视觉SLAM&#xff0c;采用Realsense D455&#xff08;深度传感器IMU&#xff0c;但只用RGB&#xff09;。项目地址&am…

作者头像 李华
网站建设 2026/7/14 13:17:17

计算机毕业设计之基于SpringBoot框架的天气预报系统的设计与实现

随着信息时代的到来和智能化的发展&#xff0c;人们对实时、准确的天气信息需求日益增长。传统的天气预报方式如电视、广播等&#xff0c;在实时性、个性化服务等方面存在不足。同时&#xff0c;气候变化和天气灾害的频发&#xff0c;使得对天气信息的准确获取和有效管理变得尤…

作者头像 李华
网站建设 2026/7/14 13:16:23

list stream sort Comparator.nullsLast 避免空指针的正确用法

list排序中经常是针对对象的某个字段排序&#xff0c;但是字段为null是处理起来比较麻烦&#xff0c;java中有针对此情况的api&#xff0c;下面做详细介绍。 代码案例 Test public void testListSort() {List<Book> bookList new ArrayList<>();bookList.add(new …

作者头像 李华
网站建设 2026/7/14 13:16:20

数据库设计范式

数据库有6大范式&#xff0c;一般到BCNF范式就行了&#xff1b; 学生选课总表(学号,姓名,课程号,课程名,成绩,系名,系主任)&#xff0c;复合主键是&#xff08;学号&#xff0c;课程号&#xff09; 当前满足范式不满足下一级范式的原因下一步拆分动作1NF姓名、课程名等非主属性…

作者头像 李华
网站建设 2026/7/14 13:15:44

炉石传说终极自动化脚本:如何让日常任务效率提升73%

炉石传说终极自动化脚本&#xff1a;如何让日常任务效率提升73% 【免费下载链接】Hearthstone-Script Hearthstone script&#xff08;炉石传说脚本&#xff09; 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Script 还在为炉石传说日常任务的重复操作感到…

作者头像 李华
网站建设 2026/7/14 13:15:10

Fast-GitHub:网络边界革命,重塑中国开发者的GitHub体验

Fast-GitHub&#xff1a;网络边界革命&#xff0c;重塑中国开发者的GitHub体验 【免费下载链接】Fast-GitHub 国内Github下载很慢&#xff0c;用上了这个插件后&#xff0c;下载速度嗖嗖嗖的~&#xff01; 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 当代…

作者头像 李华