def coinChange(coins: List[int], amount: int) -> int:
coins_needed = [0] + [amount+1 for _ in range(amount)] # list initialization to (a false) inf except 0 to 0
for coin in coins:
for i in range(coin, amount+1):
coins_needed[i] = min(coins_needed[i], coins_needed[i-coin] + 1) # take min coin between current value and (1 + value for i-coin)
return(coins_needed[-1] if coins_needed[-1] <= amount else -1) # return last value (if inf return -1)