• 0322零钱兑换 Marathon


    给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。

    计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。

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

    示例 1:

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

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

    输入:coins = [1], amount = 0
    输出:0
    示例 4:

    输入:coins = [1], amount = 1
    输出:1
    示例 5:

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

    提示:

    1 <= coins.length <= 12
    1 <= coins[i] <= 231 - 1
    0 <= amount <= 104

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/coin-change

    参考:

    python

    # 0322.零钱兑换
    
    class Solution:
        def coinChange(self, coins: [int], amount: int) -> int:
            """
            动态规划,完全背包,先遍历物品再遍历背包
            :param coins:
            :param amount:
            :return:
            """
            dp = [amount+1] * (amount+1)
            dp[0] = 0
            for coin in coins:
                for j in range(coin, amount+1):
                    dp[j] = min(dp[j], dp[j-coin]+1)
                    print(" dp[%d]: %d  |" % (j, dp[j]), end=' ')
            return dp[amount] if dp[amount] < amount+1 else -1
    
        def coinChange2(self, coins: [int], amount: int) -> int:
            """
            动态规划,完全背包,先背包再物品
            :param coins:
            :param amount:
            :return:
            """
            dp = [amount+1] * (amount+1)
            dp[0] = 0
            for j in range(1, amount+1):
                for i in range(len(coins)):
                    if j >= coins[i]:
                        dp[j] = min(dp[j], dp[j-coins[i]]+1)
            return dp[amount] if dp[amount] < amount+1 else -1
    
    if __name__ == "__main__":
        coins = [346,29,395,188,155,109]
        test = Solution()
        test.coinChange(coins, 9401)
    

    golang

    package dynamicPrograming
    
    import "math"
    
    // 动态规划-完全背包-先物品再背包
    func coinChange(coins []int, amount int) int  {
    	dp := make([]int, amount+1)
    	dp[0] = 0
    	for j:=1;j<=amount;j++ {
    		dp[j] = math.MaxInt32
    	}
    	// 遍历物品
    	for i:=0;i<len(coins);i++ {
    		for j:=coins[i];j<=amount;j++ {
    			if dp[j-coins[i]] != math.MaxInt32 {
    				dp[j] = min(dp[j], dp[j-coins[i]]+1)
    			}
    		}
    	}
    	if dp[amount] == math.MaxInt32 {
    		return -1
    	}
    	return dp[amount]
    }
    
    // 动态规划-完全背包-先背包再物品
    func coinChange2(coins []int, amount int) int {
    	dp := make([]int, amount+1)
    	dp[0] = 0
    	for j:=1;j<=amount;j++ {
    		dp[j] = math.MaxInt32
    		for i:=0;i<len(coins);i++ {
    			if j >= coins[i] && dp[j-coins[i]] != math.MaxInt32 {
    				dp[j] = min(dp[j], dp[j-coins[i]]+1)
    			}
    		}
    	}
    	if dp[amount] == math.MaxInt32 {
    		return -1
    	}
    	return dp[amount]
    }
    
    func min(a,b int) int {
    	if a < b {
    		return a
    	}
    	return b
    }
    
  • 相关阅读:
    k8s是什么
    jmeter性能测试的策略
    面试的灵魂拷问:你最大的缺点是什么?
    面试的灵魂拷问:你做过的最令你自豪的事情是什么?
    面试的灵魂拷问:你犯过的最大的失误是什么?
    5-django rest framework,搭建api,这是最重要的章节
    4-restfulapi的介绍,vue代码结构
    组合恒等式证明——「Zeilberger 老爷子的 T 恤上写了啥?」
    「NOI2020」 美食家 【矩阵快速幂】
    [CEOI2014] The Wall【最短路】
  • 原文地址:https://www.cnblogs.com/davis12/p/15627309.html
Copyright © 2020-2023  润新知