LeetCode 322. 零钱兑换(完全背包 最小包)

Description

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

示例 1:

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

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

Solution

参考:背包总结

class Solution:
    def coinChange(self, coins, amount):
        target = amount
        # 求最小背包,初始化时候后序数组需要取无穷大
        # 例如conin为[2, 5]
        # 将问题看作背包容量为2+5,第一个硬币cost为2,value为1
        # dp[10]代表:凑够10块钱的前提下需要最少的硬币数量
        dp = [9999999 for _ in range(amount+1)]
        dp[0] = 0

        C = coins
        V = [1 for _ in range(len(C))]
        n = len(V)

        def CompleteBackPack(cost, value):
            for i in range(cost, target+1):
                dp[i] = min(dp[i], dp[i-cost]+value)
        for i in range(n):
            CompleteBackPack(C[i], V[i])
        if dp[target] == 9999999:
            return -1
        else:
            return dp[target]

你可能感兴趣的:(LeetCode,算法----背包问题)