#322. 零钱兑换

题目描述:
给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

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

知识点:
动态规划:
多阶段决策最优解模型,每阶段都对应一组状态
状态转移方程构造方式:

  1. 递归+备忘录(反向递归)
  2. 迭代递推(正向迭代)

思路和代码:
状态转移方式:采用反向递归
状态转移方程:f(n) = 1+min(f(n-ck))
f(n):兑换n元最少需要的硬币个数
ck:第k种硬币的面值

class Solution:
    def __init__(self):
        self.hash_dict = dict()
    def coinChange(self, coins: List[int], amount: int) -> int:
        if amount ==0:
            return 0
        if amount in coins:
            return 1
        if amount < min(coins):
            return -1
        min_change_list = list()
        for coin in coins:
            if amount-coin in self.hash_dict:
                change_num = self.hash_dict[amount-coin]
            else:
                change_num = self.coinChange(coins,amount-coin)
                self.hash_dict[amount-coin] = change_num
            if change_num >0:
                min_change_list.append(change_num)
        if min_change_list:
            return 1+ min(min_change_list)
        else:
            return -1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值