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

硬币找零问题的动态规划解法与实现思考笔记

硬币找零问题的动态规划解法与实现思考笔记

一、问题背景回顾

给定不同面额的硬币数组coins和总金额amount,要求计算凑成该金额所需的最小硬币个数,若无法凑出则返回-1,且每种硬币可无限使用。这一问题属于典型的“完全背包问题”,核心是在“物品可重复选取”的约束下,寻找满足目标的最优解,动态规划是解决此类问题的高效思路。

二、基础解法:常规动态规划思路

2.1 状态定义与核心逻辑

首先明确动态规划的核心是“用子问题的最优解推导原问题解”,针对本题:

  • 定义dp[i]:表示凑成金额i所需的最小硬币个数;
  • 初始条件:dp[0] = 0(凑金额0无需硬币),其余dp[i]初始化为一个“足够大的数”(需避免后续计算溢出),代表初始状态下无法凑出该金额;
  • 状态转移:对于每个金额i和每种硬币coincoin ≤ i),若使用该硬币,则dp[i]可由dp[i - coin] + 1推导(凑i - coin的最小硬币数加当前这枚硬币),最终取所有可能中的最小值,即dp[i] = min(dp[i], dp[i - coin] + 1)

2.2 基础实现

#include<vector>#include<climits>#include<algorithm>usingnamespacestd;classSolution{public:intcoinChange(vector<int>&coins,intamount){// 初始化dp数组,INT_MAX-1避免后续+1溢出vector<int>dp(amount+1,INT_MAX-1);dp[0]=0;// 金额0的基准条件// 遍历每种硬币(完全背包:物品可重复选,先遍历物品再遍历容量)for(autocoin:coins){// 遍历从硬币面额到目标金额的所有金额for(inti=coin;i<=amount;i++){// 状态转移:尝试用当前硬币更新最小硬币数dp[i]=min(dp[i],dp[i-coin]+1);}}// 判断是否能凑出目标金额returndp[amount]==INT_MAX-1?-1:dp[amount];}};

2.3 基础解法分析

  • 时间复杂度:O(n * m),其中n为硬币种类数,m为目标金额。需遍历每种硬币,且每种硬币需遍历从其面额到目标金额的所有值,属于该问题的常规时间复杂度;
  • 空间复杂度:O(m),依赖长度为amount + 1dp数组存储子问题解,空间开销与目标金额线性相关。

三、实现细节的深度思考

3.1 初始值的选择逻辑

初始化dp数组时选用INT_MAX - 1而非INT_MAX,核心是规避整数溢出:若使用INT_MAX,当执行dp[i - coin] + 1时,INT_MAX + 1会超出int类型的取值范围,导致数值溢出变为负数,破坏状态转移的正确性。而INT_MAX - 1既满足“初始为不可达的大数”的逻辑,又能保证后续加法运算的安全性。

在工程实现中,这类“边界值处理”是保证代码鲁棒性的关键——看似微小的初始值选择,直接影响结果的正确性,尤其在大规模金额计算时,溢出问题会直接导致程序出错。

3.2 遍历顺序的合理性

本题采用“先遍历硬币、再遍历金额”的顺序,是完全背包问题的标准写法:

  • 完全背包的核心特征是“物品可重复选取”,先固定硬币(物品),再从小到大遍历金额(背包容量),能保证同一硬币被多次使用;
  • 若颠倒遍历顺序(先金额后硬币),则变为“01背包”(每个物品仅能选一次),不符合本题“硬币数量无限”的约束,会导致结果错误。

这一遍历顺序的选择,本质是对问题类型的精准匹配——理解“完全背包”与“01背包”的核心差异,才能选择正确的遍历逻辑。

3.3 边界条件的补充验证

除了dp[0] = 0的基准条件,实际应用中还需考虑以下边界场景:

  1. 目标金额为0:直接返回0(无需硬币);
  2. 硬币数组为空:若金额大于0则返回-1;
  3. 硬币面额大于目标金额:该硬币不参与该金额的状态转移(代码中通过i >= coin自然规避)。

这些边界场景的处理,无需额外编写大量代码,而是通过状态定义和遍历逻辑自然覆盖,体现了动态规划思路的简洁性。

四、优化方向与工程权衡

4.1 空间优化的可能性

基础解法的空间复杂度为O(m),理论上可进一步优化:由于状态转移仅依赖dp[i - coin](即更小金额的解),无需保存完整的dp数组,可尝试用变量压缩空间。但实际中,硬币面额不固定,不同硬币对应的i - coin差值不同,压缩空间会导致逻辑复杂度大幅提升,且O(m)的空间开销在多数场景下(如金额不超过10^4)是可接受的。

因此工程上更倾向于保留完整的dp数组——以可接受的空间开销,换取代码的可读性和可维护性,这是“性能与可读性”的典型权衡。

4.2 时间优化的尝试

时间复杂度O(n * m)是动态规划解法的常规上限,但若硬币数组存在明显特征(如面额有序),可做小幅优化:

  1. 先对硬币数组排序,遍历金额时若i - coin < 0可提前终止内层循环;
  2. 剔除硬币数组中大于目标金额的元素,减少无效遍历。

这类优化不会改变时间复杂度的量级,但能减少实际运行的循环次数,在大规模输入下可提升执行效率,属于“工程层面的细节优化”。

4.3 其他解法的对比

除动态规划外,硬币找零问题也可尝试贪心算法,但贪心仅适用于“硬币面额满足贪心选择性质”的场景(如人民币面额1、5、10、20等),对于任意面额的硬币,贪心无法保证得到最优解。例如,硬币面额为 [25, 10, 1] 时,凑金额30用贪心(25+15,共6枚)与最优解(103,共3枚)一致;但面额为 [25, 20, 1] 时,凑金额30用贪心(25+15,6枚),最优解却是 20+10(无10则为20+110,11枚?此处修正:面额[25,20,1]凑30,最优解是20+110?不,面额只有25、20、1,最优解应为20+110(11枚),而贪心是25+15(6枚),反而更优——换个例子:面额[18,10,1]凑28,贪心选18+110(11枚),最优解是102+18(10枚),此时贪心失效)。

因此,动态规划是解决“任意面额硬币找零”的通用解法,贪心仅为特定场景的补充,工程上需根据硬币面额的实际情况选择解法。

五、总结

  1. 硬币找零问题的核心是完全背包模型,动态规划的关键是定义dp[i]为凑金额i的最小硬币数,通过dp[i] = min(dp[i], dp[i - coin] + 1)完成状态转移;
  2. 实现时需注意初始值选择(避免溢出)、遍历顺序(匹配完全背包特性),这些细节直接影响代码的正确性;
  3. 工程层面需权衡性能与可读性,空间优化虽可行但性价比低,时间优化可通过细节调整实现,贪心算法仅适用于特定面额场景。
http://www.jsqmd.com/news/377660/

相关文章:

  • TPJ系列机械式螺旋圆弹簧疲劳试验机
  • 2026年市场评价好的包装袋定制厂家选哪家,四边封包装袋/自立袋/聚酯尼龙袋/三边封拉链袋,包装袋制造厂家推荐排行 - 品牌推荐师
  • 【Python毕设全套源码+文档】基于python的媒体资源管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 『NAS』设置内网固定 IP
  • 教你如何识别台式电脑电源的好坏
  • 【Python毕设全套源码+文档】基于python的采用人脸识别技术的课堂考勤管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 面试必看:打家劫舍
  • 2026年工业研学公司综合评测:聚焦科创实践与产教融合的新趋势​ - 品牌2025
  • 【Python毕设全套源码+文档】基于python的租房管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 56周作业
  • 2026年工业焊接协作机器人知名品牌商选择指南,推荐上海广为 - 品牌2025
  • comsol多孔介质流燃烧器模型,集层流流动模块,流体传热模块,浓物质传递模块和化学反应模块于...
  • 50.k8s管理-1和 k8s核心概述-2 - 实践
  • 【Python毕设全套源码+文档】基于python的个人身心健康管理系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 2026年全国防爆墙厂家哪家靠谱?靠谱优质实力强劲 适配多场景防护需求 覆盖全国多区域需求 - 深度智识库
  • 车桥耦合Matlab程序:Newmark法数值积分实现动力学求解
  • AT_agc013_d [AGC013D] Piling Up
  • 2026年汽车应急启动电源十大品牌推荐深度解析 - 品牌2025
  • 那些年我们create generate clock遇到的坑
  • 武商一卡通使用与回收:超实用指南让你轻松搞定 - 团团收购物卡回收
  • 2026年优选五大汽车电瓶设备公司选择指南 - 品牌2025
  • 2026年汽车电瓶设备出口公司推荐:全球市场中的中国智造力量 - 品牌2025
  • 详细介绍:D3.js研发交互模型指标柱形图
  • 售后完善的架空保温管价格如何,怎么选购 - mypinpai
  • 毕业论文神器!9个AI论文软件深度测评,本科生高效写作必备
  • 【python毕设源码分享】基于Python的个人身心健康管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 剖析实力强的氟橡胶制品,江苏衡水联奥橡塑获客户认可 - 工业品牌热点
  • 91.不同路径
  • 2026年开放大学排名,湖北开放大学监考严格吗 - 工业品网
  • 电脑死机怎么办?