Leetcode 322.零钱兑换

Time: 20190906
Type: Medium

题目描述

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

示例 1:

输入: coins = [1, 2, 5], amount = 11
输出: 3
解释: 11 = 5 + 5 + 1
示例 2:

输入: coins = [2], amount = 3
输出: -1
说明:
你可以认为每种硬币的数量是无限的。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/coin-change
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

状态定义

f[i]表示到总额度为i时使用的硬币数量。

状态转移方程

当前硬币可以有两种选择:

  • 不取

f[i] = min(f[i], f[i-coin] + 1)

最后再根据结果判断是不是真的可以凑成这样的零钱方案。

代码

class Solution:
    def coinChange(self, coins: 'List[int]', amount: 'int') -> 'int':
        f = [float("inf")]  * (amount + 1)
        f[0] = 0
        for i in range(1, amount + 1):
            for coin in coins:
                if i - coin >= 0:
                    f[i] = min(f[i], f[i-coin] + 1)
        return f[-1] if f[-1]!= float("inf") else -1

PS.本题解法众多,值得深究一下其他解法,比如带备忘录的自顶向下动态规划法。

END.

你可能感兴趣的:(LeetCode)