面试中的找零问题

数据结构与算法——9. 找零问题的递归解法和动态规划解法 文章目录一、分治策略与递归算法1. 分治策略的概念2. 分治策略与递归算法的关系二、优化问题和贪心策略1. 优化问题2. 贪心策略3. 贪心策略失效三、找零问题的递归解法改进递归算法解决方案四、找零问题的动态规划解法1. 动态规划解法2. 动态规划中最主要的思想3. 找零兑换:动态规划算法扩展 一、分治策略与递归算法 1. 分治策略的概念 分治策略是解决问题的典型策略:分而治之。将问题分为若干更小规模的部分通过解决每一个小规模部分问题,并将结果汇总得到原问题的解。 2. 分治策略与递归算法的关系 递归算 阅读详情

今天早上看一位搞cv的高手坯子的博客,看到了一个找零问题,觉得蛮有意思的,现分享如下:

问题描述:

        现存在一堆面值为 V1、V2、V3 … 个单位的硬币,问最少需要多少个硬币才能找出总值为 T 个单位的零钱?假设这一堆面值分别为 1、2、5、21、25 元,需要找出总值 T 为 63 元的零钱。
        很明显,只要拿出 3 个 21 元的硬币就凑够了 63 元了。 

问题分析:

        找63元,如果直接找最大面值,则有25+25+5+5+2+1,明显不是最小硬币数,所以直接找最大面值不行。怎样才能找到21呢?
        将问题分解,分别找到63-1,63-2,63-5,63-21,63-25的最小硬币数,这五个中最小的,一定也就是组成63的最小硬币数。如果求62需要求61,60,57,41,37, 求61需要求60,59,56,40,36...

        用conisUsed表示每一个面值对应的最小硬币数,则: coinsUsed[i]=coinsUsed[i-coinValue]+1;
        用coinsTrack数组记录每一个面值对应的coinValue;

可以考虑使用动态规划方法:

动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,并将这些子问题的解保存起来,如果以后在求解较大子问题的时候需要用到这些子问题的解,就可以直接取出这些已经计算过的解而免去重复运算。保存子问题的解可以使用填表方式,例如保存在数组中。


具体代码如下:

#include <cstdlib>
#include <iostream>

using namespace std;


/*
  @param coinValue:
         保存硬币面值的数组
  @param coinSize
         保存面值的种类,即coniValue的大小
  @param moneyValve
         需要找零的面值
  @param coinsUsed
         记录每一个面值所对应的最小硬币数
  @param coinsTrack
         记录组成每一个面值所对应的,使其硬币数最小所加入的硬币面值 
*/ 
void MakeChange(int* coinValue,size_t coinSize,int moneyValue,int *coinsUsed,int *coinsTrack)
{
     
     //给coinsUsed、coinsTrack赋初值
     coinsUsed[0]=0;
     coinsTrack[0]=0;
      
     //对moneyValue以下的所有money面值都要计算,都要求解以备用 ,cent为当前面值 
     for(int cent=1;cent<=moneyValue;cent++)
     {
         //记录每种money面值所对应的子问题的最小值,minCons初值为全部为1的硬币数 
         int minCoins=cent;
         //记录每种money面值所对应的加入的硬币面值          
         int lastIn=0;
         
         //分别对每种coin面值,求解其子问题
         for(int j=0;j<coinSize;j++) 
         {
             //如果当前面值大于等于硬币面值,则继续;否则退出 
             if(cent>=coinValue[j])
             {
                 //找到最小的子问题解 
                 if(coinsUsed[cent-coinValue[j]]<minCoins)
                 {
                     minCoins=coinsUsed[cent-coinValue[j]];
                     lastIn=coinValue[j];
                 }
             }
         }
         
         //保存最小硬币数 
         coinsUsed[cent]=minCoins+1;
         coinsTrack[cent]=lastIn;
     }
     
     //输出结果
     cout<<"面值为"<<moneyValue<<"所需要的最小硬币为:"<<coinsUsed[moneyValue];
     cout<<" 其面值分别为:";
     while(moneyValue>0)
     {
         cout<<coinsTrack[moneyValue]<<" ";
         moneyValue-=coinsTrack[moneyValue];
     }
} 

int main(int argc, char *argv[])
{
    //硬币面值 
    int value[]={1,2,5,21,25};
    //硬币数组大小 
    size_t size=sizeof(value)/sizeof(*value);
    //要找零的数 
    int money=45;
    //保存每个面值对应最小值,因为0号位置舍弃,故加1 
    int* coinsUsed=new int[money+1];
    int* coinsTrack=new int[money+1];
    
    MakeChange(value,size,money,coinsUsed,coinsTrack);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}


贪心算法在面试中的高频考点:硬币找零问题深度解析与变种 本文深度解析贪心算法在技术面试中的核心应用,以经典的硬币找零问题为切入点,剖析其核心思想、适用条件与常见陷阱。文章详细阐述了贪心算法的贪心选择性质与最优子结构,对比了其与动态规划、回溯算法的区别,并提供了面试实战策略与高频变种问题的解析,帮助求职者系统掌握这一高频考点。 阅读详情

相关推荐

前端面试专栏-算法篇:20. 贪心算法与动态规划入门

本文介绍了贪心算法和动态规划两种重要的算法设计策略。贪心算法通过局部最优选择寻求全局解,具有简单高效的特点,适用于满足贪心选择性质和最优子结构的问题,如找零问题和活动选择问题,但不保证所有问题都能得到全局最优解。动态规划则通过分解重叠子问题并存储中间结果来提高效率,适用于具有最优子结构的问题,如斐波那契数列和背包问题,能有效降低时间复杂度。两种算法各有优劣,需要根据具体问题特性选择合适的策略。

爱分享的程序员 1377

找零问题——贪心

找零问题——贪心算法简介,计算机浮点数运算产生的问题以及解决办法

New_Teen的博客 4797

华为OD 技术综合面,手撕代码真题整理(79):单源最短路径问题 | K 个不同整数的子数组问题 | 货币找零问题

OD,全名 Outsourcing Dispacth,中文外包派遣。华为 19 年开始探索并实行新的研发“人力外包”模式,按正式员工标准进行招聘(话虽如此,实际要求没那么高),由业务部门负责培养和管理,解决更为核心的业务问题,对于绩效优秀且能力突出的人才提供转正式员工通道。人力外包签约方为德科/科锐国际,劳动合同期为 4 年,试用期 6 个月。员工关系、五险一金、考勤发薪由德科/科锐国际负责;定级定薪、员工培训、工作安排、绩效评比和晋升等由华为负责。

梦想橡皮擦,专栏100例写作模式先行者,现象级专栏 《Python 爬虫 100 例》作者、《滚雪球学 Python 专栏》原创者 213

04 | 动态规划:完美解决硬币找零

这是我第一次在课程中提出最优子结构这一概念,所以咱们先了解一下。这东西乍一听有些玄乎,什么叫子问题之间必须相互独立?举一个简单的例子,你就明白了。比如说,假设你在外卖平台购买 5 斤苹果和 3 斤香蕉。由于促销的缘故,这两种水果都有一个互相独立的促销价。如果原问题是让你以最低的价格购买这些水果,你该怎么买?显然,由于这两种水果的促销价格相互独立、互不影响,你只需直接购买就能享受到最低折扣的价格。现在我们得到了正确的结果:最低价格就是直接购买这两种折扣水果。

qq_37756660的博客 2869

【忍者算法】从找零钱问题到三数之和:一道经典面试算法题的全面剖析|LeetCode 15 三数之和

问题转换:将三数之和转换为一个数加两数之和!

忍者算法的博客 859

面试官最爱问的7个贪心算法问题及解析

贪心算法因“每一步选当前最优”的简洁性,成为解决资源分配、调度优化等问题的利器。本文聚焦面试高频场景理解贪心算法的核心思想与适用条件掌握经典问题的贪心策略设计逻辑学会用代码实现贪心解法并验证正确性本文先通过生活案例讲解贪心算法的核心概念,再拆解7道经典面试题(含问题描述、贪心策略推导、代码实现、正确性证明),最后总结贪心算法的通用解题思路与面试技巧。贪心算法:每一步选当前最优,期望全局最优。关键条件:贪心选择性质(局部最优→全局最优)、最优子结构。问题贪心策略核心逻辑活动选择。

AI 算法实战派 623

找零问题的四种解决方法(Java)

采用自下而上的方式进行思考,定义。为组成金额 i 所需最少零钱数,

wwb623的博客 2272

自定义控件三部曲视图篇(六)——RecyclerView系列之三自定义LayoutManager

前言:把握生命里的每一分钟,全力以赴我们心中的梦,不经历风雨 怎么见彩虹,没有人能随随便便成功 在第一篇中已经讲过,LayoutManager主要用于布局其中的Item,在LayoutManager中能够对每个Item的大小,位置进行更改,将它放在我们想要的位置,在很多优秀的效果中,都是通过自定义LayoutManager来实现的,比如: 可以看到这些效果都非常棒,通过这一节的学习,大...

启舰 1万+

C语言找零问题

1.找零问题    钱的面值有1毛,5毛,1块,5块,10块,20块,50块,100块,大于100的就不算找零了,用贪心算法来找零,使得每次找零的钱的张数和最小2.代码: #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; void change(double money, double pay) { int count[7] = {0...

不想理的博客 1万+

Unity3d 编译发布到安卓平台时出现的问题集

环境搭建好了,android SDK也有了,但导出的时候提示Error building Player: Win32Exception: ApplicationName='java.exe'....... 国内好像没看到解决方法。在Unity3d的论坛里面看到一个解决方法,把C:\windows\system32\java.exe复制到C:\Windows\SysWOW64里面,我这里就解决

erictang01的专栏 1773

打通Creo与Matlab的桥梁:Simscape Multibody Link插件安装与配置全攻略

本文详细介绍了Simscape Multibody Link插件的安装与配置全流程,旨在帮助机械工程师和开发者打通Creo与Matlab/Simulink之间的桥梁,实现CAD模型到多体动力学仿真的高效转换。文章重点解析了版本兼容性、管理员权限、注册文件配置等关键步骤与常见故障排查方法,助力用户快速建立设计与仿真一体化工作流。

rrr55的博客 634

测试常见算法面试题:贪心法--找零问题

这是一个简单的贪心算法的例子,它展示了贪心算法通过每次选择局部最优解来达到全局最优解的思想。但需要注意的是,并非所有问题都适合贪心算法求解,因为有些问题的最优解可能不是贪心选择的结果。

2301_76387166的博客 1069

博途S7-1500T 使用工艺对象驱动液压轴(含SimaHydTO库)

利用工艺对象控制液压轴位置含PLC控制和仿真程序文档资料下载地址如下:液压比例伺服阀的相关应用知识请参看下面的博客文章:液压位置闭环控制(比例伺服阀应用)_RXXW_Dor的博客-优快云博客。

RXXW_Dor的博客 2900

面试必刷:硬币找零问题的5种解法对比(暴力递归→动态规划)

本文系统解析了面试经典算法题——硬币找零问题,从最直观的暴力递归解法入手,逐步优化至记忆化搜索和动态规划,并深入探讨了状态转移方程、复杂度分析及常见变种。文章旨在帮助读者不仅掌握动态规划的标准解法,更能理解其背后的优化思路与面试实战策略。

weixin_29216049的博客 638

python实现下载和离线安装包环境

导出当前电脑python安装的所有包列表requirement.txt。

m0_60352504的博客 1676

Android/Linux驱动开发:使用dev_dbg进行设备驱动调试

在本文中,我们将介绍如何使用dev_dbg宏和相关的函数来进行设备驱动调试。函数在该目录下创建了一个名为"debug"的debugfs文件。在这些函数中,您可以执行与您的设备驱动相关的调试操作。函数在该目录下创建了一个名为"debug"的debugfs文件。在这些函数中,您可以执行与您的设备驱动相关的调试操作。的结构体指针,其中包含了我们定义的文件操作函数。的结构体指针,其中包含了我们定义的文件操作函数。在上面的示例中,我们首先通过调用。在上面的示例中,我们定义了。在上面的示例中,我们定义了。

ByteKnight的博客 372

头条面试题(1-找零问题)

问题: 有4种硬币,分别价值:1、4、16、64元;一种纸币,价值:1024元。 小明去超时买东西,共花费N元(0<N<1024),他拿出一张纸币给售货员,售货员只有硬币可以给小明。问:售货员最少找给小明多少个硬币? 思路:贪心算法,依次把价值64、16、4、1的硬币的个数算出来,再相加即可得到最少硬币个数。 代码(C++): #include<iostream...

wangjiaee的博客 635

Android Telephony主要模块及功能

Telephony的代码主要由五个模块组成 1.Telephony Frameworks 代码区域: frameworks/opt/telephony/ 其中主要的文件在如下目录 /frameworks/opt/telephony/src/java/com/android/internal/telephony/ 其中比较常见的有以下几类文件 1.BaseCommands、RIL构成R

泊客 7723

算法分享系列No.8--(大厂面试实际场景算法题)---找零钱 问题

一、该类题目---基础信息列表&背景 大厂面试算法题,为了显示高逼格,显示高档次,经常跟实际问题相结合(如 股票买卖/ 找零钱问题/ 汽油问题 / 打家劫舍 / 分糖果 / 岛屿问题),想要考察面试人,从实际问题转化成熟悉的解题模型,灵活运用能力。近期问了些面试字节的朋友,30%都考到了股票。本次这类题型的梳理,也是对自己解决这类算法的一个总结。 题目难易分类【easy】【middle】【hard】 题目频率(牛客有考察次数)【高频】(10<=考察次数)【中频】(2 <=考察..

尕白白的专栏 904

【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像

【QNX+Android虚拟化方案】125 - 如何创建android-spare镜像

|~~~热爱生活、努力学习的小伙汁~~~| 1092

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

校招算法笔面试 | 校招笔面试真题-找零

这是一个贪心算法问题。需要使用最少的硬币数量来找零,由于硬币面值是4的幂次,可以使用贪心策略。

wc529065的博客 372

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

字节题--找零

找零_字节跳动2019春招研发部分编程题汇总_牛客网 贪心算法,尽量找大的,大的找不开再用小的来凑。 #include <iostream> using namespace std; int main(){ int n; cin >> n; int sum = 1024 - n; int res = 0; while(sum){ if(sum >= 64){ res += sum / 64;

zj 212

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

动态规划编程面试_面试的前25大动态编程问题

动态规划编程面试Dynamic programming is one of the most asked paradigms in any product-based company interviews. You can expect DP in online assessments also if you are in touch with any product-based company....

cumudi0723的博客 256

软件工程师技术面试一面真题

20190807 BlackRock技术面试一面 SDE实习 远程不限时间 如无特殊说明,必须使用Java进行解答。 本人给出的答案是自己的回答,并不是最优解。欢迎博友讨论,并指出可以优化之处。 1. 倒序排列给定字符串中的字母和数字(省略其他),用“-”连接 2. 使用最少纸币/硬币找零问题 要求展现OOP (是规则的面额,所以直接贪心算法) import java.io.Buf...

八门金锁的技术博客 845

重生之我在异世界学智力题(7)

在HR面试中,智力题往往被用来评估应聘者的逻辑思维、问题解决能力和创新思维。这类题目旨在通过非传统的问题形式,观察应聘者如何在压力下分析问题、寻找解决方案并有效沟通其思考过程。所以我们在锻炼自己编程能力的同时,也不能忘了锻炼自己的思维能力,故此小编每次会给大家分享两道智力题,一起看看吧!!!

z15879084549的博客 1173
上一篇: 预编译头文件无法打开问题
下一篇: typedef与宏定义区别
DylanZou
博客等级 码龄18年 13粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值