"""
322. 零钱兑换
给定不同面额的硬币 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] <= 2^31 - 1
0 <= amount <= 104

date : 11-6-2020
"""
from typing import List


class Solution:
    def coinChange(self, coins: List[int], amount: int) -> int:
        dp = [float('inf')] * (amount + 1)
        dp[0] = 0

        for coin in coins:
            for x in range(coin, amount + 1):
                dp[x] = min(dp[x], dp[x - coin] + 1)
        return dp[amount] if dp[amount] != float('inf') else -1


coins, amount = [1, 2, 5], 11
print(Solution().coinChange(coins, amount))


def coinChange(coins: List[int], amount: int) -> int:
    res = [float('inf')] * (amount + 1)
    res[0] = 0

    for coin in coins:
        for x in range(coin, amount + 1):
            res[x] = min(res[x], res[x - coin] + 1)
    return res[amount] if res[amount] is not float('inf') else -1


print(coinChange(coins, amount))


l2 = [1, 2, 2]
l1 = [1]

l2 = l1
print(l2)