55 零钱兑换

news2024/11/27 5:39:23

零钱兑换

    • 题解1 DP
      • 另一种解法(更好记)
    • 题解2 递归

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1 。

你可以认为每种硬币的数量是无限的。

示例 1:
输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1

示例 2:
输入:coins = [2], amount = 3
输出:-1

示例 3:
输入:coins = [1], amount = 0
输出:0

提示:

  • 1 <= coins.length <= 12
  • 1 <= coins[i] <= 2 31 − 1 2^{31} - 1 2311
  • 0 <= amount <= 1 0 4 10^4 104

题解1 DP

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int s = coins.size();
        sort(coins.begin(), coins.end());
        vector<int> dp(amount+1, 0);
        for(int i = 1; i < amount+1; i++){
            int tmpmin = INT_MAX;
            // 因为硬币是无限的,所以不需要考虑数量问题
            for(int j = 0; j < s && coins[j] <= i; j++){
            // 算一种情况的前提是:得先可以构成组合
                if(dp[i-coins[j]] != -1)
                    tmpmin = min(tmpmin, 1 + dp[i-coins[j]]);
            }
            if(tmpmin != INT_MAX)
                dp[i] = tmpmin;
            else dp[i] = -1;
        }
        return dp[amount];
    }
};

在这里插入图片描述

另一种解法(更好记)

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        int s = coins.size();
        sort(coins.begin(), coins.end());
        vector<int> dp(amount+1, amount+1);
        dp[0] = 0;
        for(int i = 1; i < amount+1; i++){
            for(int j = 0; j < s && coins[j] <= i; j++){
                dp[i] = min(dp[i], 1 + dp[i-coins[j]]);
            }
        }
        return dp[amount] > amount ? -1 : dp[amount];
    }
};

在这里插入图片描述

题解2 递归

class Solution {
    vector<int> dp;
    int re_dp(vector<int>& coins, int rem){
    	// dp下标不会有负数,dp[0]不需要改
        if(rem < 0) return -1;
        if(rem == 0) return 0;
        // 剪枝
        if(dp[rem] != 0) return dp[rem];
        // 主逻辑
        int tmpmin = INT_MAX;
        for(auto& i : coins){
            int res = re_dp(coins, rem-i);
            if(res >= 0)
                tmpmin = min(tmpmin, res+1);
        }
        dp[rem] = tmpmin == INT_MAX ? -1 : tmpmin;
        return dp[rem];
    }
public:
    int coinChange(vector<int>& coins, int amount) {
        if(amount == 0) return 0;
        dp.resize(amount+1, 0);
        return re_dp(coins, amount);
    }
};

在这里插入图片描述

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

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

相关文章

点赞“美丽南苑人”㉒ | 施晨阳:以青春之名 赴亚运之约

为积极培育和践行社会主义核心价值观&#xff0c;引导和激励辖区群众学习身边先进典型的道德品质和价值追求&#xff0c;进一步发挥“美丽人物”的典型示范和带动引领作用&#xff0c;南苑街道开启“点赞‘美丽南苑人’”专栏&#xff0c;向大家讲述“美丽南苑人”的故事&#…

选择共享wifi项目哪个公司好?!

当今社会&#xff0c;无线网络成为了人们生活中必不可少的一部分。在日常生活中&#xff0c;我们可能会遇到寻找WiFi的情况&#xff0c;共享WiFi逐渐成为人们越来越常用的网络连接方式&#xff0c;随着共享WiFi服务商的不断增多&#xff0c;创业者如何如何挑选和判断哪家共享Wi…

金融考研人通向成功的快速通道——中国人民大学与加拿大女王大学金融硕士

在金融行业中&#xff0c;有这样一个中外合作办学硕士&#xff0c;它成为了很多金融考研人通向成功的快速通道。它免全国联考&#xff0c;学制一年&#xff0c;无英语要求&#xff0c;看到这里&#xff0c;王老师壹柒叁壹陆壹久领悟刘玲&#xff0c;很多同学是不是已经猜到了&a…

PNG转EPS,包括Latex导入

在电脑TEXLIVE文件夹里中找到bmeps.exe TEXLIVE\2022\bin\win32 可以新建一个文件夹picture&#xff08;图片和exe文件必须在一个文件夹里&#xff09;&#xff0c;将bmeps.exe复制出来&#xff0c;方便后续大量图片操作 导入png图片 新建一个txt文件&#xff0c;命名为Fig1.…

php74 安装sodium

下载编译安装libsodium wget https://download.libsodium.org/libsodium/releases/libsodium-1.0.18-stable.tar.gz tar -zxf libsodium-1.0.18-stable.tar.gz cd libsodium-stable ./configure --without-libsodium make && make check sudo make install下载编译安装…

【Redis】高效保障MySQL和Redis的数据一致性?

高效保障MySQL和Redis的数据一致性? 在满足实时性的条件下,不存在两者完全保存一致的方案,只有最终一致性方案。根据网上的众多解决方案,总结出 6 种,直接看目录: 不好的方案 1、先写 MySQL,再写 Redis 如图所示: 这是一副时序图,描述请求的先后调用顺序; 橘黄…

Macos数据库管理:Navicat Premium 中文

Navicat Premium提供了直观且易用的图形用户界面&#xff0c;使得操作更为便捷。Navicat Premium 中文支持多种数据库系统&#xff0c;如MySQL、MariaDB、Oracle、SQLite、PostgreSQL等&#xff0c;可以让用户在同一平台上管理不同类型的数据库。Navicat Premium拥有强大的数据…

BUUCTF学习(四): 文件包含tips

1、介绍 2、hackBar插件安装 教程&#xff1a; Hackbar插件安装-CSDN博客 3、解题 php://filter/readconvert.base64-encode/resource要读取的文件 ?filephp://filter/readconvert.base64-encode/resourceflag.php Base64 在线编码解码 | Base64 加密解密 - Base64.us 结束

剑指offer(C++)-JZ50:第一个只出现一次的字符(算法-其他)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 在一个长为 字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1&#xff08;需要区分…

传统鞋业焕发智造魅力,健康鞋步力宝品牌数字化转型助力多方把控

随着经济环境的变化以及市场竞争的加剧&#xff0c;加之我国劳动力、土地以及资源环境成本的快速上升&#xff0c;以劳动密集型为主、通过低附加值方式发展的传统产业集群遭遇瓶颈。而数字化时代的到来&#xff0c;不仅给各行各业带来了巨大的变革&#xff0c;也为传统鞋服业带…

王兴投资5G小基站

边缘计算社区获悉&#xff0c;近期深圳佳贤通信正式完成数亿元股权融资&#xff0c;本轮融资由美团龙珠领投。本轮融资资金主要用于技术研发、市场拓展等&#xff0c;将进一步巩固和扩大佳贤通信在5G小基站领域的技术及市场领先地位。 01 佳贤通信是什么样的公司&#xff1f; 深…

BIO实战、NIO编程与直接内存、零拷贝深入剖析

原生 JDK 网络编程 BIO BIO&#xff0c;意为 Blocking I/O&#xff0c;即阻塞的 I/O。   BIO 基本上就是我们上面所说的生活场景的朴素实现。在 BIO 中类 ServerSocket 负责绑定 IP 地址&#xff0c;启动监听端口&#xff0c;等待客户连接&#xff1b;客户端 Socket 类的实例…

倍福TwinCAT3.0软件与C++通讯问题(EAP通讯)

文章目录 一. TwinCAT控制器之间的几种通讯方式1.添加EAP设备2.添加变量刷新的Task周期3. 测试 一. TwinCAT控制器之间的几种通讯方式 协议硬件要求实时性说明ADS通讯普通网卡&#xff0c;支持无线典型值&#xff1a;< 100msServer/Client&#xff0c;要写 PLC 程序&#x…

全志R128芯片应用开发案例——ADC驱动烟雾传感器

ADC驱动烟雾传感器 本文案例代码下载地址ADC驱动烟雾传感器案例代码https://www.aw-ol.com/downloads?cat24 原理介绍 MQ-2型烟雾传感器属于二氧化锡半导体气敏材料&#xff0c;属于表面离子式N型半 导体。当处于200、300℃温度时&#xff0c;二氧化锡吸附空气中的氧&#…

网络端口验证

网络端口连通性验证 1、背景2、目标3、环境4、部署4.1、准备工作4.2、安装4.3、场景测试 1、背景 在日常运维过程中经常会遇到以下两种场景&#xff1a; 1、程序业务端口的开具及验证 2、业务程序访问异常网络排障 2、目标 1、验证端口的正确开具 2、网络策略的连通性 3、环…

onlyoffice的介绍搭建、集成过程。Windows、Linux

文章目录 什么是onlyoffice功能系统要求安装必备组件 windows搭建资源下载安装数据库onlyoffice安装测试 Linux搭建dockerdocker-compose 项目中用到的技术&#xff0c;做个笔记哈~ 什么是onlyoffice 在本地服务器上安装ONLYOFFICE Docs Community Edition Community Edition…

day06-前后端项目上传到gitee、后端多方式登录接口、发送短信功能、发送短信封装、短信验证码接口、短信登录接口

1 前后端项目上传到gitee 2 后端多方式登录接口 2.1 序列化类 2.2 视图类 2.3 路由 3 发送短信功能 4 发送短信封装 4.0 目录结构 4.1 settings.py 4.2 sms.py 5 短信验证码接口 6 短信登录接口 6.1 视图类 6.2 序列化类 1 前后端项目上传到gitee # 我们看到好多开源项目…

系列九、Redis的发布订阅

一、概述 Redis的发布订阅是进程间的一种消息通信模式&#xff0c;发送者&#xff08;Publisher&#xff09;发送消息&#xff0c;订阅者&#xff08;Subscriber&#xff09;接收消息。 二、命令 三、案例演示 3.1、订阅单个 客户端订阅 cctv-1、cctv-2、 cctv-3三个频道 SUB…

如何提高逻辑思维能力?

逻辑思维能力&#xff0c;对学习和工作效率具有直接的影响力&#xff0c;所以在企业招聘中&#xff0c;逻辑思维能力几乎是笔试的必考内容&#xff0c;当然目前招聘测评已经从纸笔测试&#xff0c;演变为在线测评&#xff0c;通常被称之为岗位胜任力测评&#xff0c;或者是综合…