322.零钱兑换(动态规划)

Posted cheviszhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了322.零钱兑换(动态规划)相关的知识,希望对你有一定的参考价值。

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

技术图片技术图片

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

 

以前我会直接贪婪算法,然后解不出来,现在第一想法就是动态规划:把每一步的最优解都算出来,取最后一项返回。

本题状态转移方程: dp[ i ] =  min(dp[ i - coins[ j ]],......) 

  特判:1.i - coins[ j ]<0: continue

        2.if dp[ i - coins[ j ]] == -1: continue  并且 j 对应的dp[ i - coins[ j ]]不加入状态转移方程中的比较,我现在去看看答案。

 

 

 

class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [0]*(amount+1)
        for i in range(1,amount+1):
            if i<min(coins):
                dp[i]=-1
                continue
            curmin = float(‘inf‘)
            for j in range(len(coins)):
                if i-coins[j]<0:continue
                if dp[i-coins[j]] == -1:continue
                curmin = min(curmin,dp[i-coins[j]]+1)
            dp[i] = curmin if curmin!=float(‘inf‘) else -1
        print(dp)
        return dp[-1]
 
如果动态规划,自底向上的方法都是这样的。

以上是关于322.零钱兑换(动态规划)的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode.322-零钱兑换(最大/小型动态规划)

Leetcode.322-零钱兑换(最大/小型动态规划)

322. 零钱兑换(动态规划)

[LeetCode] 322. 零钱兑换 ☆☆☆(动态规划)

动态规划解题(leetcode322零钱兑换)

322.零钱兑换(动态规划)