牛客热题:兑换零钱(一)

news2024/11/27 3:57:52

📟作者主页:慢热的陕西人

🌴专栏链接:力扣刷题日记

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

在这里插入图片描述

文章目录

  • 牛客热题:兑换零钱(一)
    • 题目链接
    • 方法一:动态规划
      • 思路
      • 代码
      • 复杂度
    • 方法二:递归
      • 思路
      • 总结思路:
      • 代码
      • 复杂度

牛客热题:兑换零钱(一)

题目链接

兑换零钱(一)_牛客题霸_牛客网 (nowcoder.com)

方法一:动态规划

思路

首先我们思考当arr中最小的零钱是1时,那么这时候是凑成aim的最大钱数,aim个1块钱。

①状态表示:

d p [ i ] dp[i] dp[i]表示的是i块钱用数组中的零钱表示的最少钱数。

②状态转化:

​ 显然 d p [ i ] dp[i] dp[i]的值可以从 d p [ i − a r r [ j ] ] dp[i - arr[j]] dp[iarr[j]]的状态获取,但是题目要求最小值,所以取一个min

d p [ i ] = m i n ( d p [ i ] , d p [ i − a r r [ j ] ] + 1 ) dp[i] = min(dp[i], dp[i - arr[j]] + 1) dp[i]=min(dp[i],dp[iarr[j]]+1)

③填表顺序:

​ 对于dp数组的话,因为dp的当前状态需要用到之前状态,所以按照从左的到右的顺序

​ 对于原数组arr,这个数组的话不牵扯到状态转移,只需要遍历就好了,习惯上也从左到右来遍历

④初始化:

对于dp数组,开始时除了 d p [ 0 ] = 0 dp[0] = 0 dp[0]=0,其余的dp状态都应该设定为对应的最大值+1,也就是aim + 1;

⑤返回值:

代码

    int minMoney(vector<int>& arr, int aim) 
    {
        //创建dp数组
        vector<int> dp(aim + 1, aim + 1);
        dp[0] = 0;
        for(int i = 0; i <= aim; ++i)
        {
            for(int j = 0; j < arr.size(); ++j)
            {
                if(i >= arr[j])
                dp[i] = min(dp[i], dp[i - arr[j]] + 1);
            }
        }
        return dp[aim] > aim ? -1 : dp[aim];
    }

复杂度

时间复杂度: O ( a i m ∗ a r r . s i z e ( ) ) O(aim * arr.size()) O(aimarr.size()), 遍历dp数组的同时去遍历原数组。

空间复杂度: O ( a i m + 1 ) O(aim + 1) O(aim+1),额外使用了一个dp数组,长度是aim+1。

方法二:递归

思路

  1. recursion 函数

    • 这是一个递归函数,用于计算组合达到目标金额 aim 所需的最小硬币数量。
    • 参数包括 arr(硬币面值数组)、aim(目标金额)、dp(用于记录中间结果的数组)。
  2. 基础情况

    • 如果 aim < 0,表示当前的组合方式超过了目标金额,返回 -1
    • 如果 aim == 0,表示当前的组合方式正好等于目标金额,返回 0(硬币数量为0)。
    • 如果 dp[aim - 1] != 0,说明 aim 这个金额已经计算过了,直接返回 dp[aim - 1]
  3. 递归求解

    • 初始化 MinINT_MAX,用于记录当前情况下的最小硬币数量。
    • 遍历所有硬币面值 arr[i],对于每个面值,计算使用该面值时剩余金额 aim - arr[i] 的最小硬币数量 res
    • 如果 res >= 0(说明可以组合成功)且 res + 1 比当前 Min 小,则更新 Min
  4. 更新结果

    • dp[aim - 1] 设置为 Min,如果 Min 仍然是 INT_MAX,表示无法组合成 aim,返回 -1,否则返回 Min
  5. minMoney 函数

    • 这是主函数,初始化了 dp 数组并调用了 recursion 函数来求解最小硬币数量。
    • 如果 aim < 1,直接返回 0,因为小于等于 0 的金额不需要硬币。

总结思路:

  • 使用递归方法和动态规划思想,通过 dp 数组记录中间结果,避免重复计算,提高效率。
  • 递归函数中每次选择一个硬币面值,尝试组合达到目标金额,找出最少的硬币数量。
  • 如果某个金额已经计算过,直接返回已存储的结果,避免重复计算,提高效率。

代码

    int recurison(vector<int>& arr, int aim, vector<int>& dp)
    {
        if(aim < 0) return -1;

        if(aim == 0) return 0;
        
        if(dp[aim - 1] != 0)
            return dp[aim - 1];

        int Min = INT_MAX;
        //遍历所有的值
        for(int i = 0; i < arr.size(); ++i)
        {
            //递归运算选择当前的面值
            int res = recurison(arr, aim - arr[i], dp);

            //获取最小值
            if(res >= 0 && res < Min)
            Min = res + 1;
        }
        //更新最小值
        dp[aim - 1] = Min == INT_MAX ? -1 : Min;
        
        return dp[aim - 1]; 
    }
    
    int minMoney(vector<int>& arr, int aim) 
    {
        if(aim < 0) return -1;
        vector<int> dp(aim, 0);

        return recurison(arr, aim, dp);
    }

复杂度

  • 时间复杂度: O ( n ∗ a i m ) O(n * aim) O(naim),一共需要计算aim个状态的答案,每个状态需要枚举n个面值
  • 空间复杂度: O ( a i m ) O(aim) O(aim),递归栈深度及辅助数组的空间

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习资料分析

学习资料分析 速算运算 √截位直除分数比较等比修正其他速算方法基期与现期基本概念求基期求现期增长率与增长量增长相关统计术语求一般增长率比较一般增长率增长量比重比重相关公式求比重平均数倍数间隔增长乘积增长率年增长率混合增长率资料分析:主要测查报考者对文字、数字…

windows环境如何运行python/java后台服务器进程而不显示控制台窗口

1.通常我们在windows环境下使用Java或Python语言编写服务器程序&#xff0c;都希望他在后台运行&#xff0c;不要显示黑乎乎的控制台窗口&#xff1a; 2.有人写了一个bat文件: cd /d D:\lottery\server && python .\main.py 放到了开机自启动里&#xff0c;可是开机的…

“土猪拱白菜” 的学霸张锡峰,如今也苦于卷后端

大家好&#xff0c;我是程序员鱼皮&#xff0c;前几天在网上刷到了一个视频&#xff0c;是对几年前高考励志演讲的学霸张锡峰的采访。 不知道大家有没有看过他的演讲视频。在演讲中&#xff0c;衡水中学的学霸张锡峰表达了城乡孩子差距大、穷人家的孩子只想要努力成为父母的骄…

港理工最新综述:基于LLM的text-to-SQL调查(方法实验数据全面梳理)1

【摘要】文本到SQL旨在将自然语言问题转换为可执行的SQL语句,这对用户提问理解、数据库模式理解和SQL生成都是一个长期存在的挑战。传统的文本到SQL系统包括人工工程和深度神经网络。随后,预训练语言模型(PLMs)被开发并用于文本到SQL任务,取得了可喜的成绩。随着现代数据库变得…

02_01_SpringMVC初识

一、回顾MVC三层架构 1、什么是MVC三层 MVC是 模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;、控制器&#xff08;Controller&#xff09;的简写&#xff0c;是一种软件设计规范。主要作用是降低视图与业务逻辑之间的双向耦合&#xff0c;它不是一种…

如何轻松利用人工智能深度学习,提升半导体制造过程中的良率预测?

背景 这个项目涉及半导体制造过程的监测领域。在半导体制造中&#xff0c;不断收集来自传感器或过程测量点的信号是常态。然而&#xff0c;并非所有这些信号在特定的监测系统中都同等重要。这些信号包括了有用的信息、无关的信息以及噪声。通常情况下&#xff0c;工程师获得的…

MySQL-----排序 GROUP BY

在我们对数据进行分析的时候&#xff0c;通常会根据一个或多个列对结果集进行分组&#xff0c;从而得到我们想要的结果。例如&#xff1a;统计考某一门课程的学生信息等。 而MySQL的GROUP BY 语句根据一个或多个列对结果集进行分组。同时&#xff0c;我们也可以使用 COUNT, SUM…

【实战进阶】用Zig高效引入外部库,打造专属命令行神器!

经过几周的密集练习&#xff0c;我们开始对 Zig 有了感觉了吧。我反正已经开始能熟练的安装 Zig 并搭建项目了。本篇将把这些核心的技能加以混合使用&#xff0c;拿编写命令行程序为目的&#xff0c;把整个流程给大家跑一遍&#xff0c;手把手教导一遍&#xff0c;和大家一起梳…

Vscode中使用make命令

前言 需要注意&#xff0c;如下操作需要进行网络代理&#xff0c;否则会出现安装失败的情况 安装 第一步 — 安装MingGW &#xff08;1&#xff09;进入官网下载 &#xff08;2&#xff09;下载完成之后&#xff0c;双击exe文件 &#xff08;3&#xff09;点击Install &#x…

day09--151.翻转字符串里的单词+ 右旋字符串

一、151.翻转字符串里的单词 题目链接&#xff1a;https://leetcode.cn/problems/reverse-words-in-a-string/ 文章讲解&#xff1a;https://programmercarl.com/0151.%E7%BF%BB%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2%E9%87%8C%E7%9A%84%E5%8D%95%E8%AF%8D.html#%E7%AE%97%E6%…

PROSAIL模型前向模拟与植被参数遥感

原文链接&#xff1a;PROSAIL模型前向模拟与植被参数遥感 “绿水青山就是金山银山”的生态文明理念现已深入人心&#xff0c;从顶层设计到全面部署&#xff0c;生态文明建设进入举措最实、推进最快、力度最大、成效最好的时期。生态文明评价必须将生态系统健康作为基本内容&am…

什么是深拷贝;深拷贝和浅拷贝有什么区别;深拷贝和浅拷贝有哪些方法(详解)

目录 一、为什么要区别深拷贝和浅拷贝 二、浅拷贝 2.1、什么是浅拷贝 2.2、浅拷贝的方法 使用Object.assign() 使用展开运算符(...) 使用数组的slice()方法&#xff08;仅适用于数组&#xff09; 2.3、关于赋值运算符&#xff08;&#xff09; 三、深拷贝 3.1、什么是…

全网首发:教你如何直接用4090玩转最新开源的stablediffusion3.0

1.stablediffusion的概述&#xff1a; Stable Diffusion&#xff08;简称SD&#xff09;近期的动态确实不多&#xff0c;但最新的发展无疑令人瞩目。StableCascade、Playground V2.5和Stableforge虽然带来了一些更新&#xff0c;但它们在SD3面前似乎略显黯然。就在昨晚&#x…

基于SpringBoot+Vue高校自习室预约系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

C++初学者指南第一步---3.输入和输出(基础)

C初学者指南第一步—3.输入和输出&#xff08;基础&#xff09; 1. I/O Streams(I/O流) #include <iostream>int main () {int i;// read value into istd::cin >> i; // print value of istd::cout << i << \n; }数据的来源和目标 …

主观评测图生3D之 --- Era3D

文章目录 概述真人测试&#xff08;一般&#xff09;动物&#xff08;猫猫狗狗&#xff0c;不ok&#xff09;Q版真人&#xff08;惊艳&#xff09; 概述 抱抱脸可以直接测试 不过抱抱脸只能够生成多视图图像以及对应的法向图。 评测的话&#xff0c;拿三类我们比较关心的图片…

基于Java+MySQL+Tomcat+maven+JavaScript+Servlet的个人博客系统

目录 一、项目简介 二、页面效果 三、涉及的知识点 四、准备工作 1、创建maven项目&#xff0c;引入依赖 2、将前端代码粘贴到webapp目录下 3、设计数据库 4、编写数据库代码 以及 封装数据库连接操作 5、创建实体类 以及 封装对数据库的增删查改操作 五、功能实现 1…

传统边界安全设备的前世今生

光看不行得防御 只能抵御已知规则 识别病毒文件 识别方式是将数据包还原成文件&#xff0c;然后对文件进行病毒检测&#xff0c;检测方式就是以下三种 1、每一个文件都有一个独一无二的MD5值&#xff0c;把病毒文件的MD5值也进行记录&#xff0c;然后进行匹配 2、文件稍有变…

【EMC专题】ESD可视化设备对比宽地线和窄地线对ESD性能的影响

ESD可视化设备 ESD可视化设备是一种通过用非接触磁场探针自动扫描ESD电流来实现ESD电流可视化的设备。如下所示磁场探针可以测量电场强度,结合不同位置移动进行扫描,通过反复施加ESD并测量,得到PCB整体的电场强度数据。 实验解析 实验目的 利用ESD可视化装置观测施加于P…

CCAA质量管理【学习笔记】​​ 备考知识点笔记(四)

第四节 质量非数据资料分析的基础工具 1 关 联 图 2.1 概念 所谓关联图&#xff0c;就是对关系复杂而相互纠缠的问题&#xff0c;依据原因—结果或目的一手段等关系&#xff0c; 在逻辑上用箭头把各要素之间的因果关系连接起来&#xff0c;厘清复杂问题、整理语言文字资料…