package com.freetymekiyan.algorithms.level.medium;
import java.util.Arrays;
/**
* You are given coins of different denominations and a total amount of money amount. Write a function to compute the
* fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any
* combination of the coins, return -1.
* <p>
* Example 1:
* coins = [1, 2, 5], amount = 11
* return 3 (11 = 5 + 5 + 1)
* <p>
* Example 2:
* coins = [2], amount = 3
* return -1.
* <p>
* Note:
* You may assume that you have an infinite number of each kind of coin.
* <p>
* Tags: Dynamic Programming
*/
public class CoinChange {
public int coinChange(int[] coins, int amount) {
int[] res = new int[amount + 1];
Arrays.fill(res, 1, amount + 1, amount + 1);
for (int coin : coins) {
for (int i = coin; i < res.length; i++) {
res[i] = Math.min(res[i], res[i - coin] + 1);
}
}
return res[amount] == amount + 1 ? -1 : res[amount];
}
}