给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1.
思路:这是一个动态规划的题。假设coins 有3种,要想得到 i 这个金额, 有三种方法可以到达i,选取三种方法中最小的那个然后加1. 初始化的时候0的方案数是0,然后其他的方案数都先给初始化为无穷大,然后在做。
public class Solution {
/**
* @param coins: a list of integer
* @param amount: a total amount of money amount
* @return: the fewest number of coins that you need to make up
*/
public int coinChange(int[] coins, int amount) {
// write your code here
int n = coins.length;
int[] dp = new int[amount + 1];
dp[0] = 0;
for(int i = 1; i <= amount; i++){
//先将当前的方案数初始化为无穷大
dp[i] = Integer.MAX_VALUE;
for(int j = 0; j < n; j++){
//如果 i 小于 coins的金额或者 i - coins 无法达到,就不用更新dp
if(coins[j] <= i && dp[i - coins[j]] != Integer.MAX_VALUE){
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
}
}