[Day13]-[动态规划]- 零钱兑换
322. 零钱兑换
难度中等 1869 收藏分享切换为英文接收动态反馈
给你一个整数数组 coins
,表示不同面额的硬币;以及一个整数 amount
,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1
。
你可以认为每种硬币的数量是无限的。
示例 1:
复制代码
示例 2:
复制代码
示例 3:
复制代码
题解
复制代码
本文字数:499 字
阅读完需:约 2 分钟
难度中等 1869 收藏分享切换为英文接收动态反馈
给你一个整数数组 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
题解
func coinChange(coins []int, amount int) int {
memo := map[int]float64{}
var dp func(int) float64
dp = func(n int) float64 {
if _, ok := memo[n]; ok {
return memo[n]
}
if n == 0 {
return 0
}
if n < 0 {
return -1
}
res := math.MaxFloat64
for _, coin := range coins {
subProblem := dp(n - coin)
if subProblem == -1 {
continue
}
res = math.Min(res, subProblem+1)
}
if res == math.MaxFloat64 {
memo[n] = -1
} else {
memo[n] = res
}
// t.Log(memo)
return memo[n]
}
return int(dp(amount))
}
Dead or Alive. 生存战斗是知识的源泉! 2018.11.08 加入
我是一名SRE哨兵,目前是好大夫基础架构部高级工程师。专注于 SRE,微服务、中间件的稳定性和可用性建设,整体负责好大夫服务治理云平台的设计和搭建!
促进软件开发及相关领域知识与创新的传播
评论