原题链接
解题思路
题目很熟悉,和以前做过的一道很类似,于是想都没想就知道肯定是动态规划。
建立一个dp数组。dp[i]表示当凑齐i时最少要多少个数字组成。状态转移方程dp[i] = Math.min(dp[i-k] + 1,dp[i]);
解释一下吧,dp[i-k]只要不等于Integer.MAX_VALUE,证明凑齐i-k,有解。并且前面已经算出来了,这时候再加上k的1位数字就行。为了保证最少,所以要在诸多解中取最小值。
解题代码
public class Solution {
public int coinChange(int[] coins, int amount) {
if (amount == 0) return 0;
int[] dp = new int[amount + 1];
dp[0] = 0;
for (int i = 1;i <= amount ;i++ ) {
dp[i] = Integer.MAX_VALUE;
for(int k :coins) {
if(i>=k && dp[i-k] != Integer.MAX_VALUE) {
dp[i] = Math.min(dp[i-k] + 1,dp[i]);
}
}
}
if(dp[amount]<Integer.MAX_VALUE && dp[amount] > 0) {
return dp[amount];
} else {
return -1;
}
}
}