LeetCode 322 零钱兑换 Python

LeetCode 322 零钱兑换 Python

题目描述:

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

示例 1:

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

示例 2:

输入: coins = [2], amount = 3
输出: -1

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

思路如下:

  • 此题可用动态规划求解,类似与背包问题,但每个硬币可用多次
  • 初始化长度为amount+1的列表,除了第一个值为0外其余值均为-1
  • 依次更新dp[i],dp[i]=min(dp[i-coins[j]])+1

代码如下

class Solution(object):
    def coinChange(self, coins, amount):
        """
        :type coins: List[int]
        :type amount: int
        :rtype: int
        """
        dp=[-1]*(amount+1)
        dp[0]=0
        for i in range(1,amount+1):
            for j in range(0,len(coins)):
                if i>=coins[j] and dp[i-coins[j]]!=-1:
                    if dp[i]==-1 or dp[i]>dp[i-coins[j]]+1:
                        dp[i]=dp[i-coins[j]]+1
        return dp[amount]
                
            
        

 

你可能感兴趣的:(LeetCode)