leetcode 日志2022.6.7

322. 零钱兑换

思路

动态规划

这道题目可以用动态规划,因为满足了使用动态规划的几个特点:求最值,最优子结构(即主问题是最优解时,子问题也是最优解)。由于还符合了重叠子问题的情况(即一个子问题被多次求解),所以可以使用备忘录的技术,使用一个数组记录子问题的答案。

技术总结

  1. 使用amount+1这个不可能的数作为 备忘录的默认值,以表示备忘录的对应位置没有记录
  2. 对于没有解的情况,在备忘录中用-1表示

代码

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        mem = [amount+1 for i in range(amount+1)]
        def dp(need):
            if 0 == need:
                return 0
            if need < 0:
                return -1
            nonlocal mem
            if mem[need] != amount+1:
                return mem[need]
            flag = True
            for i in coins:
                x = dp(need - i)
                if x < 0:
                    continue
                else:
                    mem[need] = min(mem[need],x+1)
                    flag = False#有解
            if flag:#不可解
                mem[need] = -1
            return mem[need]
        return dp(amount)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值