[leetcode] 322. Coin Change @ python

版权声明:版权归个人所有,未经博主允许,禁止转载 https://blog.csdn.net/danspace1/article/details/86682303

原题

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

Example 1:

Input: coins = [1, 2, 5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
Example 2:

Input: coins = [2], amount = 3
Output: -1
Note:
You may assume that you have an infinite number of each kind of coin.

解法

参考: https://www.youtube.com/watch?v=uUETHdijzkA
动态规划, 构造dp数组, 长度为amount+1, dp[i]表示构成面额为i 时最少需要的硬币数量, 长度为amount+1是由于我们需要构成面额amount. 初始化dp[0] = 0, 遍历coins, 更新dp, 遍历完成后, 如果dp[-1]不为无穷大, 则返回dp[-1].
状态转移方程:
dp[i]表示构成面额为i 时最少需要的硬币数量 = 构成面额为i -coin最少需要的硬币数量 + coin这一枚硬币.

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

代码

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

猜你喜欢

转载自blog.csdn.net/danspace1/article/details/86682303
今日推荐