// Coin Change — MEDIUM
// Category: dynamic-programming
You are given an integer array `coins` representing coins of different denominations and an integer `amount` representing a total amount of money.
Return the fewest number of coins needed to make up that amount. If that amount of money cannot be made up by any combination of the coins, return `-1`.
Hint: Bottom-up DP — `dp[i] = min(dp[i], dp[i - coin] + 1)` for each coin.
Example: coins = [1, 5, 10], amount = 11
Output: 2