动态规划—兑换零钱(一)解析+代码

兑换零钱(一)

题目链接:兑换零钱(一)

题目描述:

在这里插入图片描述

题目既要求要刚好组成该钱数,又要求是组成该钱数的最少货币数。
面对不同面额的零钱,我们无法直接确定其所需数量,也不知道如何组成最少。
那么我们可以采用问题缩小,缩小成钱数-1,钱数-2 … … 1,组成该钱数的最少货币数

所以我们使用动态规划的思想。将钱数分成1块1块,然后保存组成每一部分钱数的货币数,最终递推到目标钱数


  • 初始状态
    因为所求是最少货币数,我们使用一维数组即可。而数组存储的就是组成当前钱数的最少货币数。
    因为最后取最小,而100块最多由100个1块组成,所以一维数组的初始化为目标钱数即可。

  • 状态转移方程
    dp[ ]内存储的是组成当前钱数的最少货币数,对于一个面额的零钱,我们有两种选择:
    1 不使用该零钱:dp[ i ] = dp[ i ]
    2 使用该零钱:如果使用,那么相当于当前钱数 - 该面额零钱 +1 ,假如当前是arr(零钱数组)的第 j 个面额
    dp[ i ] = dp[ i - arr[ j ] ] + 1
    因为要取最小,所以dp[ i ] = min( dp[ i ] ,dp[ i - arr[ j ] ] + 1 )

代码如下:

int minMoney(vector<int>& arr, int aim){//将aim分解成每一个1块钱//状态表示凑到当前钱数的最少货币数//aim最多由aim个1元组成,所以数组大小定为aim+1,每个数组数据也设为aim+1,方便取最小值vector<int>dp(aim+1,aim+1);dp[0]=0;//将aim分解成1块1块for(int i=1;i<=aim;++i){//遍历所有面额的货币for(int j=0;j<arr.size();++j){//可以凑到当前钱数if(arr[j]<=i){//取最小//当前货币数和使用该面额货币+1的货币数dp[i]=min(dp[i],dp[i-arr[j]]+1);}}}return dp[aim]>aim?-1:dp[aim];}

最后的返回值,因为 dp[ aim ]被初始化为aim+1,所以如果dp[ aim ]>aim,说明无法刚好组成该钱数,返回 -1,反之返回最少货币数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8641.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白盒测试扫盲

目录 前言&#xff1a; 什么是白盒测试 白盒测试中验证什么 如何执行白盒测试 步骤1&#xff1a;理解源代码 步骤2&#xff1a;创建测试用例并执行 白盒测试示例 白盒测试技术 白盒测试的类型 单元测试 测试内存泄漏 其他 白盒测试的优势 白盒测试的缺点 结束语…

Matlab把两个不同的x轴和y轴画在同一个图里

我们知道画两个y轴可以用yyaxis. 那么画两个x轴呢? 这时候可以用神奇的tiledlayout. % 创建两组数据 x1 0:0.1:40; y1 4.*cos(x1)./(x12); x2 1:0.2:20; y2 x2.^2./x2.^3;t tiledlayout(1,1); % 创建一个tiledlayout % 第一个坐标系 ax1 axes(t); % 创建坐标系, 指定t为…

网络安全之反序列化漏洞分析

简介 FastJson 是 alibaba 的一款开源 JSON 解析库&#xff0c;可用于将 Java 对象转换为其 JSON 表示形式&#xff0c;也可以用于将 JSON 字符串转换为等效的 Java 对象分别通过toJSONString和parseObject/parse来实现序列化和反序列化。 使用 对于序列化的方法toJSONStrin…

Tomcat 部署优化

目录 一.Tomcat介绍 二.了解Tomcat里面里面是放什么的 三. Tomcat&#xff1a;是一个特殊的服务 有两个领域 四.tomcat概述 五.再加上那个扩展java虚拟机&#xff08;JVM&#xff09; 调优 tomcat 优化分两种 六.Tomcat核心组件 ​编辑 容器&#xff1a;什么是容器 …

C/C++内存管理详解

去年的今日&#xff0c;博主第一次发文&#xff0c;那时初出茅庐&#xff0c;没什么经验。时隔一年&#xff0c;更加优质的博文献上&#xff0c;希望可以帮助到更多的人❤️❤️❤️ 文章目录 &#x1f4ac; 前言一、C/C内存分布二、C语言中动态内存管理方式三、C内存管理方式1…

密码学—Vigenere破解Python程序

文章目录 概要预备知识点学习整体流程技术名词解释技术细节小结代码 概要 破解Vigenere需要Kasiski测试法与重合指数法的理论基础 具体知识点细节看下面这两篇文章 预备知识点学习 下面两个是结合起来使用猜测密钥长度的&#xff0c;只有确认了密钥长度之后才可以进行破解。 …

旅游卡app软件开发解决方案

旅游业的不断发展&#xff0c;旅游卡作为一种便捷的旅游方式越来越受到人们的青睐。旅游卡可以帮助游客节省旅游开支&#xff0c;同时也能让游客更好地规划自己的旅游行程。针对这种情况&#xff0c;开发一款旅游卡app软件是非常必要的。本文将介绍旅游卡app软件开发的解决方案…

基于高校图书馆的用户画像、可视化、模型预测、推荐算法项目实现

需要本项目的可以私信博主获取源码及项目&#xff01;&#xff01;&#xff01; 本研究基于高校图书馆的借阅信息、馆藏图书信息、读者入馆信息、用户信息等多维度的数据表&#xff0c;首先将不同年份的数据拼接在一起&#xff0c;按照时间维度进行整合&#xff0c;并保证数据…

JVM原理:JVM运行时内存模型(通俗易懂)

目录 前言正文虚拟机栈局部变量表操作数栈动态链接方法返回地址 本地方法栈本地方法存在的意义本地方法的调用 虚拟机堆堆结构Eden区Survivor区域老年代Old区常用参数指令 方法区常量池 运行时常量池方法信息类信息域信息JDK1.7前的方法区JDK1.7时的方法区JDK1.7后的方法区 程序…

【MYSQL篇】Update语句原理详解

文章目录 前言缓冲池Buffer PoolInnoDB 内存结构redo logundo logBinlog 总结 前言 前面的文章我们已经对MySQL的查询语句的执行流程进行了说明&#xff0c;感兴趣的可以去看看&#xff1a; 【MySQL篇】Select语句原理详解 本篇文章我们来聊聊 MySQL更新语句的执行原理。更新…

【JavaSE】方法

目录 【1】一个小例子 【2】方法概念及使用 【2.1】什么是方法(method) 【2.2】方法定义 【2.3】方法调用的执行过程 【2.4】实参和形参的关系(重要) 【1.5】没有返回值的方法 【2】函数重载 【2.1】为什么需要方法重载 【2.2】方法重载概念 【2.3】方法签名 【3】…

卷积神经网络--猫狗系列之下载、导入数据集

(由于是学习&#xff0c;所以文章会有一些报错及解决办法) 在Kaggle()获取数据集&#xff1a;&#xff08;没有账号先去注册一个账号&#xff0c;在注册时可能会出现的问题见Kaggle注册出现一排“Captcha must be filled out.”&#xff01;&#xff09; https://www.kaggle.…