zoukankan      html  css  js  c++  java
  • leetcode-mid-dynamic programming-322. Coin Change

    mycode

    我开始错误的思路:先用大钱除总钱数来保证 fewest number of coins,当最后剩下的amount小于最小币值的货币时,就说明return -1,但是这样想是有问题的!!!

    例如:[1,4,5]   12=5*2+2    12 =5*2 + 1*2 用了4枚,但是12 = 4*3

    因为还有下一步,也就是用次大的币值去重复这个步骤!!而且也不能直接去使用次大的,而是先把最大币值的数目-1,-2,-3.。。。依次看

    参考:

     

    思路:类似于上一个62.unique paths,就要要考虑能到达该点的路径中的上一个点的情况

    class Solution(object):
        def coinChange(self, coins, amount):
            """
            :type coins: List[int]
            :type amount: int
            :rtype: int
            """
            n = len(coins)
            # dp[i]表示amount=i需要的最少coin数
            dp = [float("inf")] * (amount+1)
            dp[0] = 0
            for i in range(amount+1):
                for j in range(n):
                    # 只有当硬币面额不大于要求面额数时,才能取该硬币
                    if coins[j] <= i:
                        dp[i] = min(dp[i], dp[i-coins[j]]+1)
            # 硬币数不会超过要求总面额数,如果超过,说明没有方案可凑到目标值
            return dp[amount] if dp[amount] <= amount else -1
  • 相关阅读:
    HDU 3401 Trade
    POJ 1151 Atlantis
    HDU 3415 Max Sum of MaxKsubsequence
    HDU 4234 Moving Points
    HDU 4258 Covered Walkway
    HDU 4391 Paint The Wall
    HDU 1199 Color the Ball
    HDU 4374 One hundred layer
    HDU 3507 Print Article
    GCC特性之__init修饰解析 kasalyn的专栏 博客频道 CSDN.NET
  • 原文地址:https://www.cnblogs.com/rosyYY/p/10978958.html
Copyright © 2011-2022 走看看