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.
Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)
Example 2:
coins = [2], amount = 3
return -1.
Note:
You may assume that you have an infinite number of each kind of coin.
题目分析:因为个数是无穷的,所以就是一个完全背包计数问题,dp[i]表示合到i所需要的最少个数,dp初始化为无穷大,dp[0] = 0
public class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
for(int i = 0; i < coins.length; i ++) {
for(int j = 0; j <= amount; j ++) {
int pre = j - coins[i];
if(pre >= 0 && dp[pre] < Integer.MAX_VALUE) {
dp[j] = Math.min(dp[j], dp[pre] + 1);
}
}
}
if(dp[amount] == Integer.MAX_VALUE) {
return -1;
}
return dp[amount];
}
}

本文探讨了如何用最少数量的硬币凑成指定金额的问题,并给出了一种使用动态规划解决该问题的方法。通过两个具体例子说明了算法的运行过程。
7008

被折叠的 条评论
为什么被折叠?



