290 字
1 分钟
零钱兑换

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

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

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

示例 1:

**输入:**coins = [1, 2, 5], amount = 11 输出:3 **解释:**11 = 5 + 5 + 1 写一下主要代码的思路,还是数组dp储存答案,用前面的答案计算后面的,使用循环计算所有值

dp[0]=0 ##也就是0元的时候需要0个硬币
##双层循环
for i in range(1,1+amount):##amount+1因为需要一直算到amount
dp[i]=float('inf')##每次进循环前重置为无穷大,不然数组初始化全为0,取小只会取0
for j in range(len(coins)):
if(coins[j]<i):##每次硬币数值必须小于钱数,不然减出来负数没意义
dp[i]=min(dp[i],dp[i-coins[j]]+1)
if dp[amount]=='inf':##如果最后还是无穷大,返回-1,没有方案
return -1
return dp[amount]

感觉动态规划的都要好好复习一遍,还是挺有必要的

零钱兑换
https://overtone-zoean.vercel.app/posts/零钱兑换/
作者
Zoean
发布于
2026-05-02
许可协议
CC BY-NC-SA 4.0