# Quoc Trinh

## [DP] Minimum number of coins need for a specific amount

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 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`.

You may assume that you have an infinite number of each kind of coin.

Example 1:

```Input: coins = [1,2,5], amount = 11
Output: 3
Explanation: 11 = 5 + 5 + 1
```

Example 2:

```Input: coins = , amount = 3
Output: -1```

Explanation:

We use dynamic programming for this problem: First, we try to resolve the smaller problem!

```Suppose we have numbers type of coins = [1,2,5]
We need to get minimum coins for amount 2
The smallest amount is 0 then we need 0 coin
With amount 1 we need 1 coin
With amount 2:
For case: coin 1 < 2, mean coin 1 can be used, then 1 coin
We need to calculate the coins for remain amount
The reimain amount is 2-1 = 1
No. of coin for amount 1 is 1
=> for this case we need 2 coins.
For case: coin 2 <= 2, mean coin 2 can be used, then we have 1 coin
We need to calculate the coins for remain amount
The reimain amount is 2 - 2 = 0
No. of coin for amount 0 is 0
=> for this case we need 1 coins.
compare with the previouse case, 1<2 then the answer is 1
For case 5: 5 > 2, cannot use
Then we just continue until the amount we're looking for.
```

Solution:

```public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount+1];
Arrays.fill(dp, amount + 1);
dp = 0;
Arrays.sort(coins);
for (int a = 1; a <= amount; a++){
for(int i = 0; i<coins.length; i++){
if (coins[i] <= a){
int remain = a - coins[i];
int numOfCoin = 1 + dp[remain];
dp[a] = Math.min(dp[a], numOfCoin);
}
}
}
return dp[amount] > amount? -1: dp[amount];
} ```