【leetcode】322. 零钱兑换(动态规划)

【力扣技巧之动态规划】力扣322:零钱兑换【C++】 原题 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币的数量是无限的。 分析 这道题是一道典型的动态规划的题目。对于动态规划的题目,我们一直说有五个过程,首先要找到状态,其次确定base case,再者定义一个适宜采用动态规划的dp数组,然后要找到状态转移方程,最后求得题解。 对于这道题来说,题目要求求解可以凑成总金额所需的最少的硬币个数,那么状态就是对于凑成每一个金额所需 阅读详情

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

示例 1:

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

示例 2:

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

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


解题分析:

https://labuladong.gitbook.io/algo/di-ling-zhang-bi-du-xi-lie/dong-tai-gui-hua-xiang-jie-jin-jie

思路:自底向上遍历,硬币的面额为value = coins[j],如果i - value < 0那么表示没办法凑成,设置为INT_MAX。下面接着判断dp[i - value ]这个值是不是等于INT_MAX,如果不等于则取当前的值+1(+1表示选择这个硬币)。然后去min最小值即可,遍历的是coins。最后遍历完一遍coins,取得的最小值即dp[i]的值

int coinChange(vector<int>& coins, int amount)
{
	vector<int> dp(amount + 1, amount + 1);
	dp[0] = 0;
	for (int i = 1; i < dp.size(); i++)
	{
		int res = INT_MAX;
		for (int j = 0; j < coins.size(); j++)
		{
			if (i - coins[j] < 0)
				continue;
			int t = dp[i - coins[j]] == INT_MAX ? INT_MAX : dp[i - coins[j]] + 1;
			res = min(res, t);
		}
		dp[i] = res;
	}
	if (dp[amount] == INT_MAX) return -1;

	return dp[amount];
}

第一次做的。
巨慢的解法,但是通过了。时间空间都是倒数

// 这两个值在提交的时候不用定义,其内部已经定义好了
#define INT_MAX 0x7fffffff
#define INT_MIN 0x80000000


int coinChangeImpl(vector<int>& coins, int amount, unordered_map<int, int> &hash)
{
	if (coins.size() == 0)
		return -1;

	if (amount == 0)
		return 0;
	if (amount < 0) return -1;
	int res = INT_MAX;

	for (int i = 0; i < coins.size(); i++)
	{
		int t;
		if (hash.find(amount - coins[i]) != hash.end())
		{
			t = hash.find(amount - coins[i])->second;
		}
		else
		{
			t = coinChangeImpl(coins, amount - coins[i], hash);
			hash[amount - coins[i]] = t;
		}
		
		if (t == -1)
			continue;
		res = std::min(res, t + 1);
	}
	if (res == INT_MAX)return -1;
	return res;
}


int coinChange(vector<int>& coins, int amount)
{
	unordered_map<int, int> hash;
	return coinChangeImpl(coins, amount, hash);
}

改成自底向上的方法来查找。性能稍好一些。类似斐波那契数列。
注意,当没有办法算出来这个值的时候,dp[i] 改存什么

在这里插入图片描述

python【力扣LeetCode算法题库】322-零钱兑换(动态规划) 零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明:... 阅读详情

相关推荐

传感器采集信息的频率(采样频率)

较高的采集频率通常能提供更详细的信息,但也会增加数据处理和存储的负担。在某些应用中,较高的采样频率可能是必要的,而在其他情况下,则可能会选择适当的低采样频率以降低功耗和数据处理压力。传感器采集信息的频率(采样频率)是指传感器在一定时间内对输入信号进行采样的次数。对于一些需要快速检测和响应的应用,如运动传感器、声音传感器等,高采样频率是至关重要的。高采样频率通常需要更多的功耗和更大的存储容量,因为产生的数据量更大。例如,对于快速运动的对象,较低的采样频率可能无法捕捉到运动的真实轨迹。

chen的博客 5340

LeetCode-322-零钱兑换

零钱兑换 力扣索引 322. 零钱兑换 518. 零钱兑换 II 零钱兑换 原始问题 给定不同面额的硬币 coins和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。你可以认为每种硬币的数量是无限的。 下面我将以下图举例说明,其中amount=11,coins=[1,2,3],很显然我们在脑海中轻轻的过一遍就能想出由三个面额为3的硬币加上一个面额为2的硬币就组成了最优的答案:4枚、 ![](https://img-b

Neal_caffrey 509

电机控制个人学习路线及专业书籍资源分享

个人学习电机控制的学习路线,和相关专业书的电子文档分享

weixin_45182459的博客 9912

【LeetCode】零钱兑换及其升级版(动态规划、回溯法)

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。

凝眸伏笔的博客 4243

泛微Ecology流程数据表结构解析:workflow_requestbase和workflow_currentoperator到底怎么关联查询?

本文深入解析泛微Ecology系统中workflow_requestbase和workflow_currentoperator表的结构与关联机制,提供SQL查询语句示例,帮助开发者高效查询流程数据。涵盖待办事项、已办事项、办结事项和流程监控等典型场景,并分享性能优化技巧和常见问题排查指南。

weixin_33738555的博客 804

华为OD机考双机位C卷 - 简单的解压缩算法 (Java & Python & JS & GO & C++ & C)

华为OD机考双机位C卷 - 简单的解压缩算法 , 提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 128

leetcode 322. 零钱兑换(动态规划)

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。 示例1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说明...

qq_29762941的博客 383

17track单号查询逆向分析

这就说明该网站很有可能存在其它检测点,而检测本地替换最大可能的就是检测了代码格式化或者代码长度。也一样,要么导致网站卡死,要么会导致网页加载异常,这里可能就难到不少人了,让我们一步一步解决。而这个站主要是检测了代码格式化,无限循环检测造成了网站卡死,经多次测试发现检测点共三处。方法中代码很长,但是经调试后发现,它其实只返回一个固定的值,这里直接写死即可。同样的,虽然看起来很长,但是跟过之后就会发现流程很简单,这里主要就是对。追加了一些值,是一条很长的语句,整理代码。,核心流程也很简单,稍微跟一下就出来了,

pyzzd的博客 1621

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

/** * 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 * 输入: coins = [1, 2, 5], amount = 11,输出: 3 解释: 11 = 5 + 5 + 1 * 输入: coins = [2], amount = 3,输出: -1 */ public class DP { public static int exchangeRecursive(i.

qq_27215113的博客 5780

数据分析案例-对某宝用户评论做情感分析

目录 原始数据 绘制词云图 情感分析 原始数据 原始数据为某宝一商品的用户评论数据 绘制词云图 # coding=utf-8 import jieba import re import wordcloud import imageio # 打开需要分析词频的文本 with open('淘宝评论3.0.txt', encoding='utf-8') as f: data = f.read() # 文本预处理 :去除一些无用的字符只提取出中文出来 new_data

m0_64336780的博客 1万+

用业务语义织就企业数据之网:SAP Datasphere 的定位、架构与落地场景全解析

SAP Datasphere作为SAP业务数据云的核心组件,通过语义层整合企业内外部数据,支持实时分析与AI应用。其核心功能包括数据集成、语义建模、虚拟化与仓库能力,通过Spaces实现资源隔离,Data Builder和Business Builder分别面向技术和业务建模。该平台与SAP HANA Cloud、SAC等深度集成,支持财务统一分析、供应链可视化等典型场景,并可通过BW bridge实现传统BW资产云化迁移。Datasphere强调开放互联,能与Databricks等生态伙伴协同,为企业提供

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1361

动态规划解决硬币找零问题(指定面额及各面额硬币数量)

参考博客:https://blog.csdn.net/qq_51666839/article/details/121865336 这里写出我的理解及借鉴的代码 假设面额种类有4种: int a[4] = {1,2,5,16}; 对应的数目: int b[4] = {3,4,2,0}; 要凑出的金额为:m c[m+1] : 存放最少硬币数的数组, c[k]表示待找金额为k时所需最少硬币数,+1是因为c[0]=0 用动态规划的方法解决这个问题就是要先假设最坏情况是用无穷个硬币来凑出所需金额,然后再逐步迭代,在满

zoey_peak的博客 3041

calibre:将calibre 的layer number 转换为实际的laymer 名称(7)

可以使用与版图数据库配套的(Standard Verification Rule Format,标准验证规则格式),在 Calibre DESIGNrev 中加载图层名称。

u013620135的博客 984

LeetCode:322. 零钱兑换——动态规划从案例入门

LeetCode:322. 零钱兑换——动态规划从案例入门 🍎道阻且长,行则将至。🍓!!!

Super algorithm 的博客,技术爱好者。 2277

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

动态规划LeetCode-322.零钱兑换

如果dp[2]还是INT_MAX的话,说明用这个硬币的话,无法得到金额2,那么这时候即使加上一个3元的硬币,也无法得到5元,所以这个时候就不能更新dp[5],因为原来的dp[5]可能已经被其他硬币组合更新过,或者还没有被更新过,但此时这个路径是无效的。当j=2时,dp[2 -2]=dp[0]=0,所以dp[2]=0+1=1。然后其他下标值,考虑到递推公式的特性,dp[j]必须初始化为一个最大的数,否则就会在min(dp[j - coins[i]] + 1, dp[j])比较的过程中被初始值覆盖。

2303_80070412的博客 1106

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[动态规划]Leetcode322.零钱兑换(python)

[动态规划]Leetcode322.零钱兑换 如果读者对于动态规划思路解法还不是很了解,可以先点击链接查阅我之前的一篇博文《算法之【动态规划】详解》,很详细的介绍了动态规划求解思路及方法,有利于你更好的学习动态规划。 题目描述 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币的数量是无限的。 示例1 输入:coins = [1, 2, 5], amount = 11

阿旭的博客 1309

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

LeetCode322. 零钱兑换//力扣322. 零钱兑换(贪心//动态规划//DFS//BFS)

LeetCode322. 零钱兑换//力扣322. 零钱兑换(贪心//动态规划) 来源:力扣(LeetCode) 链接:题目跳转 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。 你可以认为每种硬币的数量是无限的。 示例1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = 5 + 5 + 1 示例 2: 输入:co...

MyHeaven7的博客 324

动态规划解leetcode.322零钱兑换问题

其中 cj​ 代表的是第 j 枚硬币的面值。如手中有面值为1、2、5的硬币,需要七元,可以在F(7-5)=F(2)种可能的基础上增加一枚5元硬币(注:F(2)指需要2元时不同的硬币组合数量),因为新加入一枚硬币,所以F(2)+1;定义 F(i) 为组成金额 i 所需最少的硬币数量,假设在计算 F(i) 之前,我们已经计算出 F(0)−F(i−1) 的答案。(即未被更新过),说明无法凑出目标金额,返回。:将问题分解为子问题(凑出更小的金额)。你可以认为每种硬币的数量是无限的。,即最少需要的硬币数。

2301_81193552的博客 1210

【leetcode】322 零钱兑换(动态规划)

题目链接:https://leetcode-cn.com/problems/coin-change/ 题目描述 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5...

zjwreal 966

动态规划——零钱兑换(Leetcode 322)

背包问题是动态规划非常重要的一类问题,它有很多变种

青春无问西东 岁月自成芳华 1143

leetCode322. 零钱兑换-动态规划

动态规划(Dynamic Programming) 1.动态规划题目特点 计数: 有多少种方法走到右下角 有多少种方法选出k个数使得和是Sum 求最大最小值 从左上角到右下角路径的最大数字和 最长上升子序列的长度 求存在性 取石子游戏,先手是否必胜 能不能选出k个数字使得和是sum 2.例题 1.leetcode-322. 零钱兑换 求最大最小值 给定不同面额的硬币 co...

风物长宜放眼量 305

「代码随想录」322. 零钱兑换 【动态规划】力扣详解!

换一种对零钱的方式

代码随想录 642

LeetCode 322:零钱兑换(动态规划)

LeetCode 322:零钱兑换(动态规划) 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 示例 1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amou...

bitdai2018 222

LeetCode 322. 零钱兑换(Java 动态规划)

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1。 示例1: 输入: coins = [1, 2, 5], amount = 11 输出: 3 解释: 11 = 5 + 5 + 1 示例 2: 输入: coins = [2], amount = 3 输出: -1 说...

Mr.hu 3511

Leetcode 322. 零钱兑换 动态规划

Leetcode 322. 零钱兑换

想买很多漂亮衣服但是买不起的博客 392

LeetCode 322.零钱兑换 (动态规划)

题目传送门:322.零钱兑换 题目详情: 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回-1 。 你可以认为每种硬币的数量是无限的。 示例1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = 5 + 5 + 1示例 2: 输入:coins = [2], amount = 3 输出:-1示例 3: 输入..

zjsru_Beginner的博客 755
上一篇: 【leetcode】509. 斐波那契数(动态规划)
下一篇: 【leetcode】42. 连续子数组的最大和(动态规划)
eclipse_c
博客等级 码龄14年 28粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值