当前位置: 首页 > news >正文

动态规划:最少硬币凑金额问题详解

LeetCode322

给你一个整数数组coins,表示不同面额的硬币;以及一个整数amount,表示总金额。

计算并返回可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1

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

示例 1:

输入:coins =[1, 2, 5], amount =11

输出:3

解释:11 = 5 + 5 + 1

示例 2:输入:coins =[2], amount =3

输出:-1

Python解法

动态规划

class Solution: def coinChange(self, coins: List[int], amount: int) -> int: # INF:代表一个不可能达到的硬币数量,用来标记该金额无法凑出 # 最多全用1元硬币只需要amount枚,amount+1一定达不到,充当无穷大 INF = amount + 1 # 创建dp数组,dp[x]表示凑出金额x所需最少硬币数 # 数组长度amount+1,覆盖0~amount所有金额,初始全部填充INF(默认都凑不出来) dp = [INF] * (amount + 1) # 边界条件:金额为0时,不需要任何硬币,硬币数量为0 dp[0] = 0 # 外层循环:遍历从1到amount的每一个目标金额,逐个计算最少硬币 for i in range(1, amount + 1): # 内层循环:尝试每一种硬币,看能否用当前硬币更新dp[i] for coin in coins: # 当前硬币面额不能大于当前要凑的金额i,否则不能选这枚硬币 if coin <= i: # 两种选择取最小值: # 1. dp[i]:不选当前硬币,维持原来的最少硬币数 # 2. dp[i - coin] + 1:选当前硬币,先凑i-coin,再加这1枚硬币 dp[i] = min(dp[i], dp[i - coin] + 1) # 判断最终结果: # 如果dp[amount]还是INF,说明无法凑出目标金额,返回题目要求的-1 # 否则dp[amount]就是凑出amount的最少硬币数量,直接返回 return -1 if dp[amount] == INF else dp[amount]

Java解法

动态规划

class Solution { public int coinChange(int[] coins, int amount) { // INF 充当无穷大,最多全1元硬币只需amount枚,amount+1一定达不到,标记无解 int INF = amount + 1; // dp数组:dp[money] = 凑出金额money所需最少硬币数量 int[] dp = new int[amount + 1]; // 全部初始化为无解标记INF Arrays.fill(dp, INF); // 边界条件:金额0,不需要硬币,数量为0 dp[0] = 0; // 外层循环:依次计算1 ~ amount每一个金额的最少硬币数 for (int money = 1; money <= amount; money++) { // 内层循环:遍历每一种硬币,尝试用该硬币更新当前金额的最优解 for (int c : coins) { // 硬币面额不能超过当前要凑的金额,否则无法选取该硬币 if (money >= c) { // 两种方案取最小值: // 方案1:dp[money],不使用当前硬币,保持原有最优值 // 方案2:dp[money - c] + 1,使用当前硬币,先凑money-c,再加1枚当前硬币 dp[money] = Math.min(dp[money], dp[money - c] + 1); } } } // 三元判断返回结果: // 若dp[amount]仍等于INF,说明无法凑出目标金额,返回题目规定的-1 // 若不等于INF,dp[amount]就是凑出amount的最少硬币数量,直接返回 return dp[amount] == INF ? -1 : dp[amount]; } }

C++解法

动态规划

class Solution { public: int coinChange(vector<int>& coins, int amount) { // INF充当无穷大标记,最多全用1元硬币仅需amount枚,amount+1不可能达到,代表无解 int INF = amount + 1; // dp数组:dp[money]表示凑出金额money需要的最少硬币数量 vector<int> dp(amount + 1, INF); // 边界条件:金额为0时,不需要任何硬币,硬币数为0 dp[0] = 0; // 外层循环:逐个计算1 ~ amount所有金额的最少硬币数 for (int money = 1; money <= amount; money++) { // 内层循环:遍历每一种硬币,尝试用当前硬币更新最优解 for (int c : coins) { // 硬币面额不能超过当前要凑的金额,否则无法选用该硬币 if (money >= c) { // 两种方案取更小值: // 1. dp[money]:不选当前硬币,保留原有最优硬币数 // 2. dp[money - c] + 1:选当前硬币,凑完money-c后再加这一枚硬币 dp[money] = min(dp[money], dp[money - c] + 1); } } } // 三元表达式返回结果: // dp[amount]等于INF说明无法凑出目标金额,返回-1;否则返回最少硬币数量 return dp[amount] == INF ? -1 : dp[amount]; } };
http://www.jsqmd.com/news/1181561/

相关文章:

  • MXFP4与FP8双量化技术实战:gpt-oss-120b模型优化完整教程
  • 从原理到实践:深度解析特征图融合与拼接的核心技术与场景选择
  • 终极指南:Audio Flamingo Next Think - NVIDIA革命性音频推理模型完全解析
  • 【限时开源】ChatGPT文献综述写作SOP手册(含28个学科专属Prompt库+查重规避策略)
  • 如何优化Phi-4-mini-instruct_rai_1.7.1_npu_4K的推理速度:混合优化策略与性能基准测试
  • Mixtral-8x7B-Instruct-v0.1-da8w8-torchao-v0.17.0聊天模板详解:构建高效对话交互系统
  • NVIDIA Kimi-K2.6-Eagle3安全与隐私:企业级AI应用的安全考量
  • 计算机毕业设计之基于SpringBoot社区志愿者服务平台 -lw
  • Vite 生产环境的代码分割策略:动态 import、分包配置与预加载优化的全链路拆解
  • 汇川easyPLC_小白免费入门100步_72步_ST_CASE语句编写流水灯1
  • Gemini 3.5 上手指南:第一次用语言模型,先从这 10 个任务开始
  • 层次分解位置编码
  • Vue Carousel事件处理详解:从slideclick到pagechange的实战应用
  • Qwen2-1.5B_rai_1.7.1_npu_4K开发者指南:ONNX模型集成与API调用最佳实践
  • AICoding之MCP(格式待调整版)
  • 2026肇庆暴雨多发!楼顶外墙 阳光房阳台窗边漏水如何彻底解决? - 宅安选房屋修缮
  • Mamba2与Transformer的完美融合:NVIDIA-Nemotron-Labs-3-Elastic-30B-A3B-BF16架构解析 [特殊字符]
  • 135、超分模型中的损失函数设计:从L1到感知损失的演进
  • 如何利用Mistral-7B-Instruct-v0.3_rai_1.7.1_npu_4K构建高效聊天应用:终极指南 [特殊字符]
  • TVA与具身智能融合的内在必然性(15)
  • DeepSeek提示词失效真相(97%开发者踩坑的3类语义断层)
  • 拉普拉斯噪声:从数学原理到差分隐私的实战指南
  • 题解:洛谷 AT_abc466_f Many Mod Calculation
  • 2026企业级GEO源码怎么选:架构安全、可二次开发源码选型指南
  • 量化评估详解:FDS、GATC、TCD 三大指标在 Cosmos-H-Surgical-Simulator 中的意义
  • LFM2-2.6B-ONNX_rai_1.7.1安全部署指南:保护模型与数据的最佳实践
  • 终极性能优化指南:如何在 NVIDIA GPU 上高效运行 Cosmos-H-Surgical-Simulator
  • 计算机毕业设计之jsp社区门诊管理系统的设计与实现
  • 制造企业如何构建工业元宇宙的元工厂
  • 134、RealBasicVSR实战:真实场景视频超分的端到端解决方案