LeetCode 热题 100_零钱兑换(85_322_中等_C++)(动态规划)

LeetCode 热题 100_零钱兑换(85_322)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(动态规划):
      • 代码实现
        • 代码实现(思路一(动态规划)):
        • 以思路一为例进行调试

题目描述:

给你一个整数数组 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] <= 231 - 1
0 <= amount <= 104

题解:

解题思路:

思路一(动态规划):

1、通过题目的描述需解决凑成总金额所需的最少的硬币个数,且硬币可以重复使用,这样自然而然将问题转换为了完全背包问题(金币的数量为物品的个数,金额为物品的价值)。

2、具体思路如下:
① dp[j],dp数组的含义为:放满j容量的背包,最少的物品数量。
② dp[j]=min(dp[j],dp[j-nums[i]]+1) ,等号右侧 dp[ j ]代表不放物品 i , dp[j-nums[i]]+1 代表放物品 j 。
③ dp[0]=0,因容量为 0 的背包可以放 0 件物品
④ 因取最小值,其他的dp数组的元素值为INT_MAX,数以这里需考虑溢出的情况dp[j-nums[i]]若为INT_MAX再加一则会溢出
⑤ 因可重复使用同一金额的硬币则遍历顺序为从左到右。

3、复杂度分析:
① 时间复杂度:O(Sn),其中 S 是金额,n 是面额数(物品的价值)。我们一共需要计算 O(S) 个状态,S 为题目所给的总金额(背包容量)。双重循环遍历 物品 和 背包。

② 空间复杂度:O(S)。dp 所需的空间 。

代码实现

代码实现(思路一(动态规划)):

class Solution{
public:// 定义 coinChange 函数,参数为硬币面值数组 coins 和目标金额 amountint coinChange(vector<int> &coins, int amount){// 初始化 dp 数组,大小为 amount + 1(从 0 到 amount),并将所有元素初始化为 INT_MAX// dp[i] 表示凑成金额 i 所需要的最少硬币数量vector<int> dp(amount + 1, INT_MAX);// dp[0] = 0,因为凑成金额 0 不需要任何硬币dp[0] = 0;// 外层循环遍历每种硬币(物品)for (int i = 0; i < coins.size(); i++){// 内层循环遍历从当前硬币面值到目标金额之间的所有金额(背包)for (int j = coins[i]; j <= amount; j++){// 防止数据溢出:只有当 dp[j - coins[i]] 不等于 INT_MAX 时,才进行更新// 这是因为如果 dp[j - coins[i]] 为 INT_MAX,表示无法凑成金额 j - coins[i]if (dp[j - coins[i]] != INT_MAX) {// 更新 dp[j]:表示使用当前硬币后,凑成金额 j 的最小硬币数dp[j] = min(dp[j], dp[j - coins[i]] + 1);}}}// 如果 dp[amount] 还是 INT_MAX,表示无法凑成目标金额,返回 -1// 否则返回 dp[amount],即凑成目标金额所需要的最少硬币数量return dp[amount] == INT_MAX ? -1 : dp[amount];}
};
以思路一为例进行调试
#include<iostream>
#include<vector>
using namespace std;class Solution{
public:// 定义 coinChange 函数,参数为硬币面值数组 coins 和目标金额 amountint coinChange(vector<int> &coins, int amount){// 初始化 dp 数组,大小为 amount + 1(从 0 到 amount),并将所有元素初始化为 INT_MAX// dp[i] 表示凑成金额 i 所需要的最少硬币数量vector<int> dp(amount + 1, INT_MAX);// dp[0] = 0,因为凑成金额 0 不需要任何硬币dp[0] = 0;// 外层循环遍历每种硬币(物品)for (int i = 0; i < coins.size(); i++){// 内层循环遍历从当前硬币面值到目标金额之间的所有金额(背包)for (int j = coins[i]; j <= amount; j++){// 防止数据溢出:只有当 dp[j - coins[i]] 不等于 INT_MAX 时,才进行更新// 这是因为如果 dp[j - coins[i]] 为 INT_MAX,表示无法凑成金额 j - coins[i]if (dp[j - coins[i]] != INT_MAX) {// 更新 dp[j]:表示使用当前硬币后,凑成金额 j 的最小硬币数dp[j] = min(dp[j], dp[j - coins[i]] + 1);}}}// 如果 dp[amount] 还是 INT_MAX,表示无法凑成目标金额,返回 -1// 否则返回 dp[amount],即凑成目标金额所需要的最少硬币数量return dp[amount] == INT_MAX ? -1 : dp[amount];}
};int main(int argc, char const *argv[])
{// 给定硬币面值数组和目标金额vector<int> coins = {1, 2, 5};int amount = 11;// 创建 Solution 对象Solution s;// 调用 coinChange 函数并输出结果cout << s.coinChange(coins, amount);return 0;
}

LeetCode 热题 100_零钱兑换(85_322)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

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

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

相关文章

游戏盾IP可以被破解吗

游戏盾IP&#xff08;如上海云盾SDK、腾讯云游戏盾&#xff09;是专为游戏行业设计的高防服务&#xff0c;旨在抵御DDoS攻击、CC攻击等威胁。其安全性取决于​​技术架构、防护能力​​以及​​运维策略​​。虽然理论上没有绝对“无法破解”的系统&#xff0c;但游戏盾IP在合理…

SpringBoot实战1

SpringBoot实战1 一、开发环境&#xff0c;环境搭建-----创建项目 通过传统的Maven工程进行创建SpringBoot项目 &#xff08;1&#xff09;导入SpringBoot项目开发所需要的依赖 一个父依赖&#xff1a;&#xff08;工件ID为&#xff1a;spring-boot-starter-parent&#xf…

【软考-高级】【信息系统项目管理师】【论文基础】进度管理过程输入输出及工具技术的使用方法

定义 项目进度管理是为了保证项目按时完成&#xff0c;对项目中所需的各个过程进行管理的过程&#xff0c;包括规划进度、定义活动、活动优先级排序、活动持续时间、制定进度计划和控制进度。 管理基础 制定进度计划的一般步骤 选择进度计划方法&#xff08;如关键路径法&a…

【Linux】之【Get】 chroot 环境下安装deb包时 .postinst:行 9: 201 段错误 (核心已转储)ldconfig

背景 如题&#xff0c;在postinst文件中直接执行了ldconfig命令&#xff0c; chroot 环境下出错&#xff0c;安装失败 分析 chroot 环境下不能用 ldconfig 和 systemctl 但是&#xff1a;如果环境是 chroot&#xff0c;系统有可能没完整挂载 /proc、/dev、系统路径&#xff…

【论文精读与实现】EDC²-RAG:基于动态聚类的文档压缩方法提升检索增强生成RAG性能

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创AI未来! 🚀 1. 论文核心思想 这篇由清华大学团队提出的EDC-RAG框架,针对当前…

OSPF接口的网络类型和不规则区域

网络类型(数据链路层所使用的协议所构建的二层网络类型) 1、MA --- 多点接入网络 BMA --- 支持广播的多点接入网络 NBMA --- 不支持广播的多点接入网络 2、P2P --- 点到点网络 以太网 --- 以太网最主要的特点是需要基于MAC地址进行物理寻址&#xff0c;主要是因为以太网接口所连…

HTTP代理:内容分发战场上的「隐形指挥官」

目录 一、技术本质&#xff1a;流量博弈中的「规则改写者」 二、战略价值&#xff1a;内容分发的「四维升级」 三、实战案例&#xff1a;代理技术的「降维打击」 四、未来进化&#xff1a;代理技术的「认知升级」 五、结语&#xff1a;代理技术的「战略觉醒」 在数字内容爆…

(2)网络学习之堡垒机

堡垒机和防火墙的区别&#xff1a; 1.功能定位 防火墙主要负责抵御外部攻击&#xff0c;就像一道坚固的城墙&#xff0c;防止黑客进入内部网络。堡垒机则专注于内部管理&#xff0c;监控和记录运维人员的操作行为&#xff0c;确保内部网络的安全。 2.部署位置与作用范围 防…

minio命令行客户端mc常见用法

安装minio命令行客户端mc https://min-io.cn/docs/minio/linux/reference/minio-mc-admin.html # Windows安装minio命令行客户端 choco install minio-client -y# Linux安装mc客户端 wget -c -P /usr/local/bin/ https://dl.min.io/client/mc/release/linux-amd64/mc # 赋予可…

idea调整控制台日志显示长度

概述 在调试时&#xff0c;idea控制台显示的日志有长度显示&#xff0c;当显示的日志太长时&#xff0c;后生成的日志会覆盖掉之前生成的日志内容。想要调整长度就可以按以下方式进行设置。 设置方法 Settings -> Editor -> General -> Console -> Override con…

oracle em修复之路

很早以前写的文章&#xff0c;再草稿中存放太久了&#xff0c;今天开始整理20年来工作体会&#xff0c;以后陆续发出&#xff0c;希望给大家提供小小的帮助。 去年做的项目使用的oracle数据库&#xff0c;最近要看一下&#xff0c;启动机器进入系统&#xff0c;出现无法加载数…

QT中怎么隐藏或显示最大化、最小化、关闭按钮

文章目录 方法一&#xff1a;通过代码动态设置1、隐藏最大化按钮2、隐藏最小化按钮3、隐藏关闭按钮方法 1&#xff1a;移除 WindowCloseButtonHint方法 2&#xff1a;使用 Qt::CustomizeWindowHint 并手动控制按钮 4、同时隐藏最大化和最小化按钮5、同时隐藏最大化和关闭按钮6、…

性能比拼: Redis vs Memcached

本内容是对知名性能评测博主 Anton Putra Redis vs Memcached Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中&#xff0c;我们将对比 Redis 和 Memcached。我会介绍一些功能上的不同&#xff0c;但主要关注 性能。 首先&#xf…

P1331 洛谷 海战

题目描述 思路 这个题需要读懂题意&#xff0c;即“什么样的形式表示两只船相撞&#xff1f;” ----> 上下相邻或左右相邻 如果图是不和法的&#xff0c;一定存在如下结构&#xff1a; # # . # 或 # # # . 或 # . # # 或 . # # #即四个格子里有三个#&#xff0c;一个"…

传统项目纯前端实现导出excel之xlsx.bundle.js

传统项目纯前端实现导出excel之xlsx.js 自从vue问世后&#xff0c;使得前端开发更加简洁从容&#xff0c;极大的丰富组件样式和页面渲染效果&#xff0c;使得前端功能的可扩展性得到极大地加强。虽然vue的使用对于前后端分离的项目对于功能实现与扩展有了质的飞跃&#xff0c;但…

2025.04.10-拼多多春招笔试第四题

📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 04. 优惠券最优分配问题 问题描述 LYA是一家电商平台的运营经理,负责促销活动的策划。现在平台上有 n n n

基于 Spring Boot 瑞吉外卖系统开发(三)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;三&#xff09; 分类列表 静态页面 实现功能所需要的接口 定义Mapper接口 Mapper public interface CategoryMapper extends BaseMapper<Category> {}定义Service接口 public interface CategoryService extends ISe…

FlinkSQL的常用语言

FlinkSQL 常用语言指南 FlinkSQL 是 Apache Flink 提供的 SQL 接口&#xff0c;允许用户使用标准 SQL 或扩展的 SQL 语法来处理流式和批式数据。以下是 FlinkSQL 的常用语言元素和操作&#xff1a; 基本查询 -- 选择查询 SELECT * FROM table_name;-- 带条件的查询 SELECT c…

spring mvc异步请求 sse 大文件下载 断点续传下载Range

学习连接 异步Servlet3.0 Spring Boot 处理异步请求&#xff08;DeferredResult 基础案例、DeferredResult 超时案例、DeferredResult 扩展案例、DeferredResult 方法汇总&#xff09; spring.io mvc Asynchronous Requests 官网文档 spring.io webflux&webclient官网文…

一问看懂——支持向量机SVM(Support Vector Machine)

目录 芜湖~~~支持向量机&#xff08;SVM&#xff09; 1. 引言 2. 基本思想 3. 数学模型 3.1 超平面定义 3.2 分类间隔与目标函数 3.3 软间隔与松弛变量 4. 核函数方法&#xff08;Kernel Trick&#xff09; 4.1 核函数定义 4.2 常用核函数 5. SVM 的几种类型 6. SV…