【算法思考记录】力扣2952. 需要添加的硬币的最小数量【C++,思路挖掘,贪心与证明】
原题链接
文章目录
- 需要添加的硬币的最小数量:贪心算法实现
- 题目概述
- 示例分析
- 关键思路分析
- 贪心算法的优化选择证明
- 案例推演与算法实现
- C++ 实现
- 结论
需要添加的硬币的最小数量:贪心算法实现
题目概述
在这个困难难度的算法题中,我们要解决的问题是确定在给定一系列硬币面值的情况下,为了使[1, target]区间内的每个整数都可以由这些硬币的某种组合表示出来,需要向数组中添加的最小数量的硬币。
示例分析
- 示例 1:
- 输入:
coins = [1,4,10], target = 19
- 输出:
2
(需要添加面值2和8的硬币)
- 输入:
- 示例 2:
- 输入:
coins = [1,4,10,5,7,19], target = 19
- 输出:
1
(仅需要添加面值为2的硬币)
- 输入:
- 示例 3:
- 输入:
coins = [1,1,1], target = 20
- 输出:
3
(需要添加面值为4、8和16的硬币)
- 输入:
关键思路分析
解决问题的关键在于贪心算法的应用。核心思想是对于每个无法直接凑出的金额x
,添加面值为x
的硬币以达到最优效果。通过这种方法,我们可以逐步构建出一个能够覆盖[1, target]区间的硬币集合。
贪心算法的优化选择证明
我们可以根据这个案例抽象出普遍性做法。如果要靠添加硬币的方式,才能凑出金额x,如果此时已经能凑出[1, s]的金额(x = s + 1),我们应该选择添加面值x,以得到更优结果。
证明:
选择1. 如果添加小于x的面值:
比如说添加面值small,此时面值small与金额x - small也可以凑出金额x。增加了面值small后,[small + 1, small + 2, small + 3…small + s]这些金额都可以通过与前面的金额相加凑出,不妨想象一个区间[small + 1, small + s],因为x - small是位于[1, s]之中的(x = s + 1,且small至少为1,因此x - small至少为x - 1 = s),所以现在可以凑出x了,还可以凑出[x, small + s]中的金额,结合原来的[1, s],我们可以凑出[1, small + s]
的金额。
选择2. 添加面值x:
增加了面值x后,[x + 1, x + 2, x + 3…x + s]这些金额都可以通过与前面的金额相加凑出,因此可以结合前面的区间凑出[1, x + s]
。
选择3. 添加大于x的面值:
如果添加面值x + 1,原先能凑出的区间为[1, s],因为x = s + 1,x + 1 = s + 2,此时依然无法凑出金额x,因为区间没有覆盖到x这个点上,因此这个方案无效
。
综合以上3个选择,我们可以比对[1, small + s]和[1, x + s],因为small < x,所以毫无疑问选择x是最优做法。
案例推演与算法实现
[案例推演与算法实现的内容保持不变]
C++ 实现
实现中,首先对硬币进行排序,然后遍历每个硬币,同时维护一个变量x
表示当前考虑的金额,以及一个变量s
表示目前可以凑出的最大金额。若当前硬币面值大于x
,则添加面值为x
的硬币,直到可以凑出当前考虑的硬币面值为止。这个过程一直重复,直到可以凑出目标金额target
。
class Solution {
public:int minimumAddedCoins(vector<int>& coins, int target) {sort(coins.begin(), coins.end());long long ans = 0, s = 0, x = 1;for (auto c : coins) {if (c > x) {while (c > x) {s = s + x;x = s + 1;ans++;}}s = s + c;x = s + 1;}while (s < target) {s = s + x;x = s + 1;ans++; }return ans;}
};
结论
通过贪心算法的应用,我们可以有效地解决这个算法问题,确保在给定硬币面值的情况下,以最小的硬币数量覆盖[1, target]的所有整数。
相关文章:
【算法思考记录】力扣2952. 需要添加的硬币的最小数量【C++,思路挖掘,贪心与证明】
原题链接 文章目录 需要添加的硬币的最小数量:贪心算法实现题目概述示例分析 关键思路分析贪心算法的优化选择证明案例推演与算法实现 C 实现结论 需要添加的硬币的最小数量:贪心算法实现 题目概述 在这个困难难度的算法题中,我们要解决的…...

用友NC JiuQiClientReqDispatch反序列化RCE漏洞复现
0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友 NC JiuQiClientReqDispatch 接口存在…...

Linux:docker镜像的创建(5)
1.基于已有镜像创建 步骤: 1.将原始镜像加入容器并运行 2.在原始镜像中部署各种服务 3.退出容器 4.使用下面命令将容器生成新的镜像 现在我们在这个容器里做了一些配置,我们要把他做成自己镜像 docker commit -m "centos7_123" -a "tarr…...

数据结构与算法-D2D3线性表之顺序表
线性表:包含若干数据元素的一个线性序列,特征如下: 1)对非空表,a0是表头,无前驱; 2)an-1是表尾,无后继; 3)其他元素仅且仅有一个前驱,…...

01_W5500简介
目录 W5500简介: 芯片特点: 全硬件TCPIP协议栈: 引脚分布: W5500简介: W5500是一款高性价比的以太网芯片,其全球独一无二的全硬件TCPIP协议栈专利技术,解决了嵌入式以太网的接入问题,简单易用ÿ…...
异常 Exception 练习题 (未完成)
异常 Exception 练习题 try-catch异常处理1234 异常1(没有自己写)234 try-catch异常处理 1 class Exception01 {public static int method() {try {String[] names new String[3];//String[]数组if (names[1].equals("tom")) {//NullPointe…...

Linux系统编程:并发与信号总结
并发 并发是指两个或多个同时独立进行的活动。在计算机系统中,并发指的是同一个系统中多个独立活动同时进行,而非依次进行。 并发在计算机系统中的表现: 一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是…...

Jmeter 接口-加密信息发送(一百九十九)
方式1:使用函数助手 比如MD5加密方式: 如图,需要对${user}进行MD5加密 1、打开函数助手,找到MD5,输入需要加密的值 2、将${__MD5(${user},)}放到请求中 3、查看请求,请求成功 方式2:导入jar包…...

微信小程序nodejs+vue+uniapp视力保养眼镜店连锁预约系统
作为一个视力保养连锁预约的网络系统,数据流量是非常大的,所以系统的设计必须满足使用方便,操作灵活的要求。所以在设计视力保养连锁预约系统应达到以下目标: (1)界面要美观友好,检索要快捷简易…...
掌握Vue侦听器(watch)的应用
文章目录 🍁watch 的优缺点🍂Watch 优点🍂Watch 缺点 🍁watch 的用法🍂对象式 watch🍂函数式 watch 🍁代码示例🍂监听基本数据类型🍂监听复杂数据类型(Object…...
SAP-PP:PP顾问管理系统的相关建议
本博客将探讨生产计划领域的控制要点。这将有助于减少仓库库存不准确情况,因为库存不准确会导致实物库存、发货、成本核算和计划方面出现许多效率低下的问题。 在物料主数据关键字段中,必须配置计划交货时间、GR处理时间、内部生产时间、计划交货时间&a…...
Unity资源路径与读取
Unity资源路径有: 1、StreamingAssets:只读,一般用于存放应用程序运行时需要加载的资源文件,可以通过Application.streamingAssetsPath来获取。 2、PersistentDataPath:可读写,一般用于存放应用程序运行时…...

“大+小模型”赋能油气行业高质量发展
近日,中国石油石化科技创新大会暨新技术成果展在北京盛大举行,九章云极DataCanvas公司携油气行业一站式AI综合解决方案重磅亮相,充分展示了公司助推油气行业实现AI规模化应用深厚的AI技术实力和领先的AI应用水准,赢得了行业专家和…...
【win32_004】字符串处理函数
StringCbPrintf 函数 (strsafe.h):格式化字符串 STRSAFEAPI StringCbPrintf([out] STRSAFE_LPSTR pszDest,//目的缓冲区 LPSTR指针或者数组[in] size_t cbDest,//目的缓冲区大小[in] STRSAFE_LPCSTR pszFormat,//格式 例如: TEXT("%d&…...

如果不小心修改了按钮的名字并且忘记了原名字
出现上述情况,可以右边点击转到代码,注释掉问题行,此页的设计界面就恢复了。...

opencv阈值处理
阈值处理 二值化 自适应阈值 OTSU二值化...
html之JS
1、JS的引入 <!-- 内嵌 --><!-- <script>alert(4)</script> --><!-- 外引 --><!-- 内嵌和外引同时有的时候,内嵌被覆盖 --><script src"js/index.js" defer></script>//defer 延迟执行 2、js的变量使用…...

SQL Server的安装和首个库的创建
一、熟悉SQL Server的安装环境; 1.安装Microsoft的数据库管理系统SQL Server 2022 先把SQL Server 2022下载好后进行解压后出现以下界面然后点击基本进行安装 然后会出现以下界面: 一步步按照提示往下走即可,把SQL Server 2022安装完成后再…...

STM32下载程序的五种方法
刚开始学习 STM32 的时候,很多小伙伴满怀热情买好了各种设备,但很快就遇到了第一个拦路虎——如何将写好的代码烧进去这个黑乎乎的芯片~ STM32 的烧录方式多样且灵活,可以根据实际需求选择适合的方式来将程序烧录到芯片中。本文将…...

基于springboot + vue大学生竞赛管理系统
qq(2829419543)获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:springboot 前端:采用vue技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...