【动态规划-简单】322. 零钱兑换

【hot100-动态规划-322.零钱兑换】 力扣第322题“零钱兑换”要求计算凑成给定总金额所需的最少硬币数。使用动态规划方法,定义 dp[i] 为凑成金额 i 所需的最少硬币数。通过遍历所有硬币面额,更新 dp[i] 的值,状态转移方程为 dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1)。最终,若 dp[amount] 不为 Infinity,返回其值,否则返回 -1。时间复杂度为 $O(amount \times n)$,空间复杂度为 $O(amount)$。示例调用展示了代码的正确性。 阅读详情

【题目】
给你一个整数数组 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

示例 4:

输入:coins = [1], amount = 1
输出:1

示例 5:

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

提示:

1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104

【代码】
【方法1:记忆化搜索】
在这里插入图片描述

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        mem=dict()
        def dp(amount):
            if amount in mem:
                return mem(amount)
            #base case
            if amount==0:
                return 0
            if amount<0:
                return -1
            #求最小值,初始化为正无穷
            res=float('INF')
            for coin in coins:
                if amount-coin not in mem:
                    mem[amount-coin]=dp(amount-coin)
                subProblem=mem[amount-coin]
                #子问题无解,跳过
                if subProblem==-1:
                    continue
                res=min(res,1+subProblem) 
            return res if res!=float('INF') else -1
        return dp(amount)

【方法2:dp】
在这里插入图片描述

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp=[float('INF') for i in range(amount+1)]
        dp[0]=0
        for i in range(1,amount+1):
            for coin in coins:
                #子问题无解 跳过
                if i-coin<0:
                    continue
                dp[i]=min(dp[i],1+dp[i-coin])
        return -1 if dp[amount]==float('INF') else dp[amount]
Sharding-JDBC 系列专题 - 第九篇:高可用性与集群管理 高可用性是指系统在面对故障(如数据库宕机、网络中断)时,能够快速恢复并继续提供服务。Sharding-JDBC 和 Sharding-Proxy 提供了多种机制支持高可用性,同时需要结合底层数据库的高可用方案(如 MySQL 主从复制、MHA)来实现。高可用性和集群管理是 Sharding-JDBC 和 Sharding-Proxy 在生产环境中成功应用的关键。本篇详细介绍了数据库高可用方案、Sharding-JDBC 的故障切换机制、Sharding-Proxy 的集群部署,以及分布式治理功能。 阅读详情

相关推荐

攻击时间控制的动态逆三维制导律(源代码)

%参考文献:《攻击时间控制的动态逆三维制导律》,哈尔滨工程大学学报,2010 %编程难点:视线坐标系与参考坐标系间的转换关系 一、采用本文方法结果 二、偏航通道采用增广比例导引律

算法小站 2393

深入浅出算法题-零钱兑换的动态规划问题

点击上方“摸鱼吧算法工程师”卡片,关注星标获取有趣、好玩的前沿干货!一、 零钱兑换:硬币的最少个数给一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。计算并返回可以凑成总金额所需的最少硬币个数 。如果没有任何一种硬币组合能组成总金额,返回-1 。可认为每种硬币的数量是无限的。解题关键点经典的动态规划问题。设置一个数组dp,其中每个元...

idol24的博客 1965

JWT实战:5分钟搞定Spring Boot集成JWT认证(含完整代码示例)

本文详细介绍了如何在Spring Boot中快速集成JWT认证,提供完整的代码示例和配置指南。通过JWT实现无状态认证,解决分布式系统中的会话管理问题,提升系统扩展性和安全性。涵盖令牌生成、验证、Spring Security整合及生产级优化方案。

weixin_29327525的博客 457

JAVA练习181-零钱兑换

给你一个整数数组 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 =..

qq_48772498的博客 1854

【HAL库-STM】智能温控按键小风扇【胎教级教学】

硬件设备:DHT11,0.96寸oled屏,二/三/四线风扇(不挑),面包板 、f10的精英板等等。当人在的风扇面前时可以自行控制风扇,不在面前时又想开风扇就让他温控自行开启,(在这里有一个想法就是加上蓝牙和wifi控制的功能能够远程遥控,这个如果做的再全一点就要自主研发是一个多功能app,这里没有做。针对这个dht11,我一开始是卡在了这个check函数里面,一直是我给完dht11低电平和高电平后,dht11不回复我低电平和高电平,这个不是我的问题,当时代码是没毛病的,这个点一直卡着我。吐血五天实现小成品

weixin_52451652的博客 1741

ELK 企业级日志分析系统(1)

ELK平台是一套完整的日志集中处理解决方案,将、Logstash和Kiabana三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。ElasticSearch:是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索引擎,用来存储各类日志。Elasticsearch 是用 Java 开发的,可通过 RESTful Web 接口,让用户可以通过浏览器与 Elasticsearch 通信。

云计算运维工程师的成长之路 1865

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的博客 757

JMeter压测Dubbo接口的完整落地方案(适配3.x)

Dubbo作为主流Java微服务RPC框架,其接口压测长期面临协议私有、注册发现复杂、序列化耦合度高等技术门槛。理解Dubbo基于TCP长连接、泛化调用与SPI扩展机制的核心原理,是实现稳定压测的前提;技术价值在于绕过HTTP网关直击服务核心链路,保障大促等关键场景的性能可信度;典型应用场景包括电商订单链路压测、风控/库存等内部Dubbo服务SLA验证,以及CI/CD中性能左移实践。本文聚焦Dubbo 3.x版本,提供零第三方插件、可复用、避坑的JMeter Java Sampler落地路径。

weixin_33700809的博客 551

零钱兑换-LeetCode322

一、题目描述 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 示例一: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = 5 + 5 + 1 二、解题思路 该题要求求最少硬币数量,因而想到利用动态规划。 (1)设计状态变量:dp[i]:金额为i时的最小面

jaaccck的博客 352

推荐系统[八]算法实践总结V3:重排在快手短视频推荐系统中的应用and手淘信息流多兴趣多目标重排技术

快手推荐系统包括了传统的召回、粗排、精排、Learning To Rank 的多目标排序、多目标预估等技术环节。而在这些模块之后的技术环节就属于重排序,主要包括手机端和服务端两部分。服务端通过传统服务器部署重排服务,包括序列重排、多源内容混排、多样性模块。端上部分包括端上重排模型和端上重排策略两部分。重排技术是快手十分重要的技术环节,它的发展速度远快于其他排序环节,属于较新的技术范畴。整个序列的价值并非单 item 效果的累计,如何使得序列价值最大化;

丨汀、的博客 1065

在Simulink中进行基于强化学习控制策略的三相逆变器仿真

本文详细介绍了在Simulink中实现基于强化学习控制策略的三相逆变器仿真的完整流程。主要内容包括:1)准备工作,确保MATLAB/Simulink及相关工具箱安装;2)构建三相逆变器基础模型,包含电源、全桥电路、LC滤波器和负载;3)重点阐述强化学习控制器设计,涉及状态空间、动作空间定义,奖励函数设计和算法选择;4)实现控制逻辑,包括环境创建、代理配置和训练过程;5)仿真设置与结果分析。文章强调了模型调试优化的重要性,并建议结合文献研究提升控制效果。该方案为开发自适应电力电子控制系统提供了实用指南。

amy_mhd的博客 272

322. 零钱兑换

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回-1 。 你可以认为每种硬币的数量是无限的。 ----------------------------------------------------------------------------------------------------------------------------- classSo..

qq_48230433的博客 390

【Claude】Invalid API key 无效密钥报错已解决

API 拒绝了你提供的 key。最高频的根因是老的/被撤销的 key 藏在某处自动加载的配置文件里,而你对此不知情。→ 检查所有可能注入 key 的来源(.env.envrc、shell 配置、IDE 设置、)→ 清除无效来源 → 用/status验证。参考:Claude Code 官方《错误参考》"身份验证"章节、社区 Invalid API key 排查记录。

博客 7925

代码随想录算法day33 | 动态规划算法part06 | 322. 零钱兑换,279.完全平方数,139.单词拆分,关于多重背包

细心的同学看网上的题解,可能看一篇是遍历背包的for循环放外面,看一篇又是遍历背包的for循环放里面,看多了都看晕了,到底两个for循环应该是什么先后关系。这也是学习动态规划的苦恼所在,有的时候递推公式很简单,难在遍历顺序上!但最终又可以稀里糊涂的把题目过了,也不知道为什么这样可以过,反正就是过了。本题是要求最少硬币数量,硬币是组合数还是排列数都无所谓!所以两个for循环先后顺序怎样都可以!

m0_62415132的博客 1362

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【LeetCode】零钱兑换 [M](动态规划)

LeetCode 322:arr是面值数组,其中的值都是正数且没有重复。再给定一个正数aim。 每个值都认为是一种面值,且认为张数是无限的。 返回组成aim的最少货币数。 采用动态规划求解。

小七的博客 1431

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

动态规划(一)

代码1和代码2都是自顶向下通过递归求出最优解,代码2使用了数组实现了记忆化,减少了重复的栈开销。这样从1分算到41分,是哟个数组保存到每一分的最小值,最后得到最优解。使用备忘录的方式优化找零钱问题,也可以称为记忆化。现在在使用正向的解法,自下而上,通过公式推导。1、将复杂的原问题拆解成若干个简单的子问题。2、每个子问题仅仅解决1次,并保存它们的解。3、最后推导出原问题的解。动态规划,简称为DP。这个是使用递归的方式。

qq_40689430的博客 452

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

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

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

leetcode 322. 零钱兑换

零钱兑换解法汇总3.BFS---广度优先遍历2.动态规划3.记忆化递归4.套「完全背包」问题的公式总结 原题链接: leetcode 322. 零钱兑换 3.BFS—广度优先遍历 具体在纸上画一下,就知道这其实是一个在「图」上的最短路径问题,「广度优先遍历」是求解这一类问题的算法。广度优先遍历借助「队列」实现。 注意: 由于是「图」,有回路,所以需要一个 visited 数组,记录哪一些结点已经访问过。 在添加到队列的时候,就得将 visited 数组对应的值设置为 true,否则可能会出现同..

m0_53157173的博客 1035

LeetCode322. [零钱兑换] C++实现

Leetcode第322题即零钱兑换问题的解题思路及实现过程。

哈哈哈哈哈嗝哈哈哈 5638

动态规划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的博客 1107

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

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

阿旭的博客 1316

LeetCode 322. 零钱兑换,动态规划详细解法

通过动态规划的思想,我们能够高效地解决零钱兑换问题。通过合理定义dp数组的含义,状态转移方程,以及对初始状态的处理,可以解决类似的完全背包问题。

Lentr0py的博客 2322

Leetcode 322. 零钱兑换

Leetcode 322. 零钱兑换1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/coin-change/   本质上就是一个动态规划问题。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 2、问题解决   笔者以C++方式解决。 #include "iostream" using namespace std; #include "algorithm"

珍惜 9013

【每日一题】力扣322. 零钱兑换

文章目录题目解题思路代码(C++)递归优化动态规划总结 题目 题目链接:力扣322. 零钱兑换 给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。 你可以认为每种硬币的数量是无限的。 示例 1: 输入:coins = [1, 2, 5], amount = 11 输出:3 解释:11 = 5 + 5 + 1 示例 2: 输入:coins = [2],

倾心之作 2360

LeeCode 322-零钱兑换(经典 动态规划)

给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

weixin_42445439的博客 1017

【算法题】322.零钱兑换-力扣(LeetCode)

我们以`coins = [1, 2, 5], amount = 11`为例,我们知道,硬币就`1,2,5`这三种,所以当总金额为i时的最少硬币个数的得来就有三种情况: `dp[i-1]`时再来拼凑面值`1`的硬币; `dp[i-2]`时再来拼凑面值`2`的硬币; `dp[i-5]`时再来拼凑面值`5`的硬币

Janium的博客 1813
上一篇: 【动态规划-简单】剑指 Offer 10- I. 斐波那契数列
下一篇: 【动态规划-中等】300. 最长递增子序列
菜菜2022
博客等级 码龄9年 67粉丝 1033原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值