【做一道算一道】零钱兑换

零钱兑换

给你一个整数数组 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
0 <= amount <= 10^4

思路

虽然是在刷dp的题,但是一眼就想到回溯,写了个回溯的,果不其然超时。
再从完全背包的角度来看,感觉怪怪的,没太想明白。
看了题解大概懂了:代码随想录:零钱兑换
这个完全背包正好初始化和dp[0]的设置和前面的相反,

代码

超时的回溯

class Solution {
private:
int cnt=0;
int min_cnt=INT_MAX;void backtracking(vector<int>& coins, int& amount){if(amount==0){min_cnt=min(cnt,min_cnt);}else if(amount<0){return;}for(int i=coins.size()-1;i>=0;i--){amount-=coins[i];cnt++;backtracking(coins,amount);amount+=coins[i];cnt--;}}public:int coinChange(vector<int>& coins, int amount) {if(amount==0) return 0;if(amount<coins[0]) return-1;backtracking(coins,amount);if(min_cnt!=INT_MAX)return min_cnt;else return -1;}
};

完全背包

class Solution {
public:int coinChange(vector<int>& coins, int amount) {vector<int> dp(amount + 1, INT_MAX);dp[0] = 0;for (int i = 0; i < coins.size(); i++) { // 遍历物品for (int j = coins[i]; j <= amount; j++) { // 遍历背包if (dp[j - coins[i]] != INT_MAX) { // 如果dp[j - coins[i]]是初始值则跳过dp[j] = min(dp[j - coins[i]] + 1, dp[j]);}}}if (dp[amount] == INT_MAX) return -1;return dp[amount];}
};

因为初始化的dp为INT_MAX,所以加一道判断,避免溢出

 if (dp[j - coins[i]] != INT_MAX) { // 如果dp[j - coins[i]]是初始值则跳过

dp[j]:凑足总额为j所需钱币的最少个数为dp[j]
举例推导dp数组
以输入:coins = [1, 2, 5], amount = 5为例

初始时,dp数组被初始化为INT_MAX,除了dp[0]被设置为0,因为0金额不需要任何硬币。
数组如下:
dp = [0, INT_MAX, INT_MAX, INT_MAX, INT_MAX, INT_MAX]
逐步填充dp数组:

当coins[0] = 1时:
从j = 1开始,因为1是最小的硬币面额。
更新dp[1]为1(因为1个1元硬币就可以组成1)。
继续增加j,更新dp[j]为dp[j - 1] + 1(因为可以再加一个1元硬币)。
结果:dp = [0, 1, 2, 3, 4, 5]

当coins[1] = 2时:
从j = 2开始,因为2是当前硬币的面额。
更新dp[2]为1(因为1个2元硬币就可以组成2),这比之前的dp[2](2)更优。
由于dp[2]已更新,现在可以更新dp[4]为dp[4 - 2] + 1 = 1 + 1 = 2(因为2个2元硬币可以组成4)。
继续增加j,对于j = 3和j = 5,由于没有直接的硬币面额,我们不能直接更新dp[j],但可以比较dp[j - 2] + 1和当前的dp[j],发现对于j = 3和j = 5,当前的dp[j]已经是更优的解。
结果:dp = [0, 1, 1, 2, 2, 3]

当coins[2] = 5时:
从j = 5开始,因为5是当前硬币的面额。
更新dp[5]为1(因为1个5元硬币就可以组成5),这是最优解。
结果:dp = [0, 1, 1, 2, 2, 1]

最终,dp数组变为:
dp = [0, 1, 1, 2, 2, 1]

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

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

相关文章

栈帧浅析,堆栈漏洞概述——【太原理工大学软件安全期末补充】

在上一篇文章中我说实验一不重要&#xff0c;确实没必要完全按照实验内容逐字逐句理解&#xff0c;但是这里我们补充一个知识点 栈帧&#xff08;Stack Frame&#xff09;是计算机程序执行过程中&#xff0c;调用栈&#xff08;Call Stack&#xff09;中的一个单元&#xff0c;…

hugging face:大模型时代的github介绍

1. Hugging Face是什么&#xff1a; Hugging Face大模型时代的“github”&#xff0c;很多人有个这样的认知&#xff0c;但是我觉得不完全准确&#xff0c;他们相似的地方在于资源丰富&#xff0c;github有各种各样的软件代码和示例&#xff0c;但是它不是系统的&#xff0c;没…

Linux-DNS域名解析服务01

BIND 域名服务基础 1、DNS&#xff08;Domain Name System&#xff09;系统的作用及类型 整个 Internet 大家庭中连接了数以亿计的服务器、个人主机&#xff0c;其中大部分的网站、邮件等服务器都使用了域名形式的地址&#xff0c;如 www.google.com、mail.163.com 等。很显然…

探索C嘎嘎的奇妙世界:第十四关---STL(string的模拟实现)

1. string类的模拟实现 1.1 经典的string类问题 上一关已经对string类进行了简单的介绍&#xff0c;大家只要能够正常使用即可。在面试中&#xff0c;面试官总喜欢让学生自己来模拟实现string类&#xff0c;最主要是实现string类的构造、拷贝构造、赋值运算符重载以及析构函数…

MacOS - command not found: brew

问题描述 command not found: brew 原因分析 没有安装 Homebrew&#xff0c;安装后即可使用~ 解决方案 打开终端&#xff0c;输入&#xff1a;/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"&#xff0c;点击回车 在弹出…

make V=1 分析

文章目录 make V11. 加载 -include 声明的文件 make V1 1. 加载 -include 声明的文件 # 顶层 Makefile 270 KCONFIG_CONFIG ? .config ...... 580 -include include/config/auto.conf 584 -include include/config/auto.conf.cmd ...... 587 $(KCONFIG_CONFIG) include/confi…

小程序的登录+发布流程

今天我们来将一下小程序的登录和发布流程&#xff01;&#xff01;&#xff01; 小程序的登录流程 流程图 首先登录流程还是看官网说的&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 这是官网发布的一个流程图 认识cod…

2 图片的分割处理和亚像素精度处理(c++和python)

本文的图片处理分为图片分割、图像的亚像素坐标处理。亚像素处理的原理可以看论文一种基于多项式插值改进的亚像素细分算法&#xff0c;该论文的详解及c的代码实现可以看博文基于多项式插值的亚像素边缘定位算法_基于多项式插值的亚像素算法-CSDN博客。下面的内容很多来自以上博…

【论文阅读】-- 时间空间化:用于深度分类器训练的可扩展且可靠的时间旅行可视化

Temporality Spatialization: A Scalable and Faithful Time-Travelling Visualization for Deep Classifier Training 摘要1 引言2 动机3 问题定义4 方法论4.1 时空复合体4.2 复数约简 5 实验6 相关工作7 结论参考文献 摘要 时间旅行可视化回答了深度分类器的预测是如何在训练…

mysql常用参数配置详解my.cnf my.ini

1.关注生产中高频常用参数 # 数据库时区 log_timestamps = system # 刷盘策略 0,1,2 innodb_flush_log_at_trx_commit # 定义了 InnoDB 用于写日志数据的缓冲区大小。当事务发生时,日志首先被写入这个缓冲区,然后再被刷新(flush)到磁盘上的重做日志文件(redo log file…

MATLAB画图时添加标注显示有效数字的位数,可以编辑此函数

本来系统有个函数&#xff0c;在图像窗口选择标注工具&#xff0c;再在图像窗口右击鼠标&#xff0c;选择"编辑文本更新函数..."&#xff0c;即打开系统的设置函数&#xff0c;可以修改最后一行&#xff1a; formattedValue [valueFormat num2str(value,4) removeV…

6.18总结

省赛排位赛2&#xff1a; 省赛排名赛2 - Virtual Judge 思路&#xff1a; 设两个方程直接解出来就行 代码&#xff1a; #include<bits/stdc.h> using namespace std; int n, m; int main() {int n, m;int ans1, ans2;cin >> n >> m;ans1 n - (-3 sqr…

QT-day3

1、思维导图 2、升级优化自己应用程序的登录界面。 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面显示。…

C#标志位的使用

C#作为一种功能强大的编程语言&#xff0c;是在.NET框架中广泛使用的语言之一。在实际应用中&#xff0c;C#的标志位在各种系统设计和编程实践中会涉及到。这篇文章将讨论如何使用C#的标志位来跟踪报警声音的播放状态。 报警系统是一种广泛应用的系统&#xff0c;它可以在关键时…

本地部署Ollama+qwen本地大语言模型Web交互界面

什么是 Ollama WebUI&#xff1f; Ollama WebUI 已经更名为 Open WebUI. Open WebUI 是一个可扩展、功能丰富且用户友好的自托管 WebUI&#xff0c;旨在完全离线操作。它支持各种 LLM 运行程序&#xff0c;包括 Ollama 和 OpenAI 兼容的 API。 Ollama WebUI 是一个革命性的 L…

低代码平台总数与深度解析

本文将全面盘点2023年至2024年国内外低代码平台&#xff0c;包括简道云、明道云、腾讯云低代码平台、Zoho Creator、微搭、华为云Astro、金蝶云苍穹、用友YonBuilder、葡萄城活字格、氚云、宜搭、织信、爱速搭、宜搭、轻流、伙伴云、Zion、钉钉搭、数睿数据、奥哲云枢、网易数帆…

AI大战:通用VS垂直模型,谁主未来?

AI大战&#xff1a;通用VS垂直模型&#xff0c;谁主未来&#xff1f; 在人工智能的世界里&#xff0c;大模型的战场正逐渐分化为两个阵营&#xff1a;通用大模型和垂直大模型。 这两种模型各有特点&#xff0c;分别在不同的场景下展现出各自的优势。 那么&#xff0c;面对这…

深度学习(九)——神经网络:最大池化的作用

一、 torch.nn中Pool layers的介绍 官网链接&#xff1a; https://pytorch.org/docs/stable/nn.html#pooling-layers 1. nn.MaxPool2d介绍 nn.MaxPool2d是在进行图像处理时&#xff0c;Pool layers最常用的函数 官方文档&#xff1a;MaxPool2d — PyTorch 2.0 documentation &…

微信小程序毕业设计-小区疫情防控系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…

ChatGPT的问题与回复的内容导出(Chorme)

我给出两种方式&#xff0c;第一种方式无使用要求&#xff0c;第二种方式必须安装Chorme 个人更推荐第二种方式 第一种方式&#xff1a;使用chatgpt自带的数据导出 缺点&#xff1a;会将当前未归档的所有聊天记录导出&#xff0c;发送到你的电子邮箱中 第二种方式&#xff1a…