找钱方式:递归,循环的解法

【贪心法】:人民币找钱问题 题目在贪心算法里面最常见的莫过于找零钱的问题了,题目大意如下,对于人民币的面值有1元 5元 10元 20元 50元 100元,下面要求设计一个程序,输入找零的钱,输出找钱方案中最少张数的方案,比如123元,最少是1张100的,1张20的,3张1元的,一共5张!思路作一个循环,每次从大的钱遍历。如果还能扣除该钱,就扣除,否则往下遍历,同时把找出去的钱进行记录 代码片:while(!flag){ 阅读详情

题目:给定一个金额m,以及几种钱币面值(比如1,2,5),求m有多少种找钱方式

解答:

a(m, c): 金额m的找钱方式,此时最大钱币面值为c

a(m, c) = sigma( a(m - k*c, next_c) ); k=0~m/c, next_c=比c小的下一个面值的钱币,比如c=5, next_c = 2

按照以上递推式,可以写出递归函数:

 

int exchangeWays(int money, int maxCurIndex = currencyNum - 1)
{
    if (money == 0) return 1;
    if (maxCurIndex == -1) return 0;
    int ways = 0;
    int maxCur = currency[maxCurIndex];
    for (int i = 0; i * maxCur <= money; i++)
        ways += exchangeWays(money - i * maxCur, maxCurIndex - 1);
    return ways;
}

这种解法的复杂度很高,O(m^(c的个数))

 

 

循环解法1:

有几个c就有几层循环,复杂度也是O(m^(c的个数))

 

int exchangeWaysIter(int money)
{
    int ways = 0;
    for (int i = 0; i * currency[2] <= money; i++)
    {
        money -= i * currency[2];
        for (int j = 0; j * currency[1] <= money ; j++)
        {
            money -= j * currency[1];
            for (int k = 0; k * currency[0] <= money; k++)//if currency[0] is 1, we can delete this loop
            {
                if (money == k * currency[0])
                    ++ways;
            }
            money += j * currency[1];
        }
        money += i * currency[2];
    }
    return ways;
}

 

重新观察递推式,

 

a(m,c) = a(m, pre_c) + a(m-c, pre_c) + a(m-2c, pre_c)...

那么,换一种思考方式,我们可以得到:

a(m, pre_c)会累计到a(m,c), a(m+c, c), a(m+2c, c)...上

看起来还是免不了两层循环:

foreach m cal a(m, pre_c):
    for i in (0, (money-m)/c): 
        a(m+i*c, c) += a(m_pre_c)

 

复杂度为O(m^2 * c的个数),不够理想

那么,我们能否求解其他形式的递推式呢?

a(m,c)=a(m, pre_c) + a(m-c, c)

          =a(m, pre_c) + a(m-c, pre_c) + a(m-2c, c)

          = ...

可以看出,这个公式和我们的第一个是完全等价的。但是这个公式显然少了一层循环

那么实际上,通过正确的遍历方式,我们只需要一个长度为max_m的数组。

由于a(m,c)会用到pre_c和m-c的信息,所以遍历的时候,先求出pre_c的所有信息a(m, pre_c),再根据m从小到大求a(m,c)。

图中,黄色的部分是pre_c,白色部分是c,绿色是正在计算的格子

所以,a(m, c) += a(m-c, c)就可以了。在下面的算法中,我使用的是让a(m-c, c)加到a(m, c)上,效果是一样的。

我们可以得出循环解法2:

 

 

int exchangeWaysIter2(int money)
{
    vector<int> ways(money + 1);//ways(i) : sum equals i, exchange ways
    ways[0] = 1;
    for (int i = 0; i < currencyNum; i++)
    {
        for (int j = 0; j + currency[i] <= money; j++)
        {
            if (ways[j])
                ways[j + currency[i]] += ways[j];
        }
    }
    return ways[money];
}

时间复杂度为O(m*(c的个数)),空间复杂度为O(m)

 

一下就降低了时间复杂度。
 

 

斐波那契数列(递归、循环、矩阵)三种解法 一、前言 《剑指Offer》中题10 二、题目 写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项。 三、思路 推导公式如下: 3.1 三种解法 方法一: 递归解法 优点:结构简单一目了然。 缺点:递归深度随n增大而增大,大量重复计算,效率低下 方法二:循环解法 优点:计算效率高,结构简单 缺点:递推理解复杂 方法三:基于矩阵乘法 优点:计... 阅读详情

相关推荐

数据结构与算法——9. 找零问题的递归解法和动态规划解法

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

花城的博客 5997

每日水题 循环进阶-找钱

一张n元人民币换成1元、2元、5元的零钱,编程计算共有多少种方法?

2301_77946044的博客 420

详解python使用递归、尾递归、循环三种方式实现斐波那契数列

@本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 本篇文章主要介绍了python使用递归、尾递归、循环三种方式实现斐波那契数列,非常具有实用价值,需要的朋友可以参考下 在最开始的时候所有的斐波那契代码都是使用递归的方式来写的,递归有很多的缺点,执行效率低下,浪费资源,还有可能会造成栈溢出,而递归的程序的优点也是很明显的,就是结构层次很清晰,易于理解 可以使用循环的方式来取代递归...

python爬虫程序学习教程 1083

递归算法分钱问题

/** * 开发一个递归方法,确定将一定数量的钱(以美分为单位)转换成两角五分的硬币,一角硬币,五分和一分硬币的方法总数。 * 例如,假设总钱数为17分,那么共有6种方法。 * 1角,7一分 * 1角,1五分,2一分 * 3五分,2一分 * 2五分,7一分 * 1五分,12一分 * 17一分 * * 为方便起见,可以理解为用25,10,5,1分解一个数,求一共有多少

Sherry_Rui的专栏 1309

找钱算法递归调用

在找钱算法中运用递归,程序简单明了。可以进一步帮你理解递归的好处。

Python实现的一个找零钱的小程序代码分享

Python写的一个按面值找零钱的程序,按照我们正常的思维逻辑从大面值到小面值的找零方法,人民币面值有100元,50元,20元,10元,5元,1元,5角,1角,而程序也相应的设置了这些面值。只需要调用函数时传入您想要找零的金额,程序会自动算各个面值的钱应该找多少张。如传入50元,则系统自动算出找零50元一张面值,如果传入60块7毛,则程序自动算出该找零50元一张,10元一张,5角一张,1角两张。 # encoding=UTF-8   def zhaoqian(money):     loop=True     tmp=['总金额:'+str(money)+'元']           # 面

暴力递归到动态规划(硬币面值)

给定一个数组arr,例如arr[7,3,100,52],都是正数且不重复 为硬币的面值,每一种面值都可以使用任意张 给定一个aim,例如1000,用以上面值有多少种方法能凑齐1000 动态规划的表 枚举行为 选一个具象化的例子,例如10好位置面值为3的货币,他依赖下面11号位置,张数为1,97的货币。依赖下面11号位置,张数为2,94的货币。。。 ?的值可由星星来算,不必重复计算左下面的和 因此,直接用左边的值加下面的值加一起就可以。 import java.util.ArrayList; impor

Niall_的博客 768

SAP CO实战:如何用KKA2/CJ88结果分析码搞定项目收入成本匹配(附真实案例)

本文深入探讨了SAP CO模块中KKA2和CJ88结果分析码在项目收入成本匹配中的高阶应用。通过真实案例解析,详细介绍了这两种分析码在分阶段收入确认和终验法项目中的配置技巧与实战经验,帮助财务人员高效解决复杂业务场景下的财务数据处理难题。

weixin_29230773的博客 167

【算法】【递归与动态规划模块】换钱的种数问题

换钱种数问题

qq_39760347的博客 713

Lama:基于傅立叶卷积的分辨率鲁棒性大掩模修复

为了缓解修复网络和损失函数都缺乏有效的感受野这个问题,提出了大掩模修复(LaMa)。LaMa基于一种新的修复网络架构,该架构使用快速傅立叶卷积(FFC),具有图像范围的感受野;高感受野感知损失;大型训练掩码,释放前两个组件的潜力。

qq_44926214的博客 1417

001-基础入门-Web演示源码&资源&工具箱等

小迪安全2023笔记

wushangyu32335的博客 4260

斐波那契数列 C#解法(递归 for循环) C++解法(简易动态规划)

斐波那契数列 题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。 n<=39 递归解法(不推荐): class Solution { public int Fibonacci(int n) { if(n<=1) return n; int result=0; result=Fibonacci(n-1)...

菜鸡工坊 3447

一文搞懂 Transformer 工作原理 !!

本文将从单头Attention工作原理多头Attention工作原理全连接网络工作原理三个方面,实现一文搞懂Transformer的工作原理。Transformer工作原理。

不要给自己设限,尝试更多可能(思所向 皆可往) 2990

二叉树的中序遍历:递归与迭代双解法详解

本文详细介绍了二叉树中序遍历的两种实现方法:递归解法和迭代解法。递归解法通过先左子树、再根节点、最后右子树的顺序遍历;迭代解法使用栈结构模拟递归。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 8641

雷达参数的设置

采样率又可以叫做采样速率或者,顾名思义就是每秒采集的次数。该值越高,单位时间内对信号的采集越多,采样率的单位可以用Hz或者sps表示(sps是采样率,是每秒采样点的数量,sp表示采样点数),一般1sps=1Hz。采样时间是采样点数和采样周期的乘积得到的结果。假设实际采样率为4560ksps,采样点数为256,那么采样周期为1/4560(ms),那么ADC的采样时间就为256*(1/4560)(ms)=0.056ms=56微秒。

qq_50974341的博客 1912

ASPICE标准快速掌握「总目录」

欢迎大家来到雪云飞星的《ASPICE标准快速掌握》,开始前博主先列出本专栏学习的大纲,同时这也可以作为大家学习ASPICE协议知识点的参考。本专栏可以帮助大家快速掌握如何在项目中使用ASPICE,ASPICE的学习通常仅需要半天时间左右,掌握方法后完全就可以结合快查表来指导具体项目的质量提升了。

雪云飞星的博客 3010

递归猴子吃桃的三种解法:源码/递归/循环

猴子吃桃问题:有一堆桃子,猴子第一天吃了其中的一半,并再多吃一个,以后每天猴子都吃掉其中一半,然后再多吃一个,当到第十天时,想再吃时,猴子发现只剩下一个桃子了,问:最初一共有多少个桃子? 第二种和第三种非常简单,我就不过多的解释 第一种递归解法:一个参数 Monkey(int day) if(day ==10) return 1; return (Monkey(day+1)+1)*2 解析 程序每次执行到if的时候,没有判断进入,则继续递归day+1,直到第十天为止,第十天只剩一个桃..

qq_59514789的博客 7484

基于深度学习的停车位检测系统(UI界面 + YOLOv8/v7/v6/v5代码 + 训练数据集)

传统的停车位检测方法主要依赖于人工或基于简单图像处理的技术,存在检测速度慢、准确率低、环境适应性差等问题。近年来,随着深度学习技术的快速发展,基于目标检测的停车位检测系统已成为研究的热点。本文基于YOLO(You Only Look Once)系列模型(包括YOLOv5、YOLOv6、YOLOv7和YOLOv8),开发了一个完整的停车位检测系统,支持实时检测、结果可视化以及UI交互界面。本文实现了一个基于深度学习的停车位检测系统,采用YOLO模型在实时视频流中进行高效检测。

YOLO 332

字符串的逆序(循环和递归两种解法)

实现一个字符串逆序,以下有循环和递归两种解法。 循环解法: 我们需要把字符串第一个元素和最后一个元素进行交换。第二个与倒数第二个进行交换,于是我们可以先利用strlen函数计算出字符串的长度(因为strlen遇到‘\0’就停止,所以可以写在自定义函数中。如果是int型数组,不能在自定义函数中用sizeof求数组长度。) 然后通过字符串两端的不断向中间靠近的方式实现。在交换的时候,建立一个临时变量储存左边的字符,将右边的字符赋予左边之后,再将临时变量中储存的左边字符赋予右边。 void reverse

在嵌入式嵌入式领域奋斗的程序猿的博客 1204

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

快速了解递归与循环

递归:你打开面前这扇门,看到屋里面还有一扇门。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还有一扇门,你继续打开它。若干次之后,你打开面前的门后,发现只有一间屋子,没有门了。然后,你开始原路返回,每走回一间屋子,你数一次,走到入口的时候,你可以回答出你到底用这你把钥匙打开了几扇门。 循环:你打开面前这扇门,看到屋里面还有一扇门。你走过去,发现手中的钥匙还可以打开它,你推开门,发现里面还...

dgyshy的博客 1598

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【剑指offer】二叉树的镜像(Java的递归和循环解法)

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 核心 本题的核心点就是想办法遍历所有的节点,同时反转各个节点的左右子节点。 递归解法 基本思路 通过递归到达叶节点,然后从下往上将每个节点的左右子节点互换。 递归解法代码简洁,是通常给出的解法。但递归解法会消耗更多的堆栈,因此在此也给出了对应的循环解法。 以下为解答: public void Mirror(TreeNode root) {...

Yasin的博客 198

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

斐波那契数列递归解法与循环解法

写一个函数,输入n,求斐波那契数列的第n项。 递归解法(效率很低): int Fibonacci(int n) { if ( 0 == n ) return 0; else if ( 1 == n ) return 1; else return Fibonacci(n-1) + Fibonacci(n-2); } 循环解法(O(n)): long long Fib

ssopp24的博客 991

递归与循环

一.递归与循环 **递归,说白了就是自己调用自己.**理论上,任何的循环都可以重写为递归形式,所有的递归也可以被表述成循环的形式,本文主要介绍如何将循环重写为递归。 二.循环改递归的两大要点 发现逻辑“相似性” 不要忘记递归的“出口” 小例子: public class demo{ public static void main(String[] args){ for(...

李就良的博客 1675

双蛋问题的递归解法和循环解法

python实现李永乐老师的双蛋问题 https://www.bilibili.com/video/av96214853 一个鸡蛋从高楼扔下,在低楼层不会摔碎,高楼层会摔碎,假设楼共100层,找出临界的楼层,即到这一层鸡蛋正好摔碎,最少要多少次 如果只有1个蛋,那么就只能从第一层扔,碎了就是1,没有到第二楼继续扔,最少要扔100次 如果有两个蛋,就先用第一个蛋确定范围,再用第二个蛋一层层测...

刘涛的博客 1998

递归算法以及递归VS循环

循环 VS 递归: 用循环能实现的,递归都能实现 循环省空间 递归能实现的,循环不一定能 递归浪费栈空间 递归的本质,循环调用自己,我也可以说递归就是函数的循环 循环 for关键字 边界(初始条件 +结束条件) 循环体 循环变量(:每个循环的不同部分) 递归 递归方法名 边界(起始条件+结束条件) 递归体 递归变量(:每个...

小豆角的博客 1096
上一篇: Palindrome Partitioning I,II[leetcode] DFS以及DP的解法
下一篇: Objective C 以及 Xcode的总结
圆形毕露
博客等级 码龄17年 20粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值