思路
将所有的金额都计算一遍,将所有元素初始化为-1,不必考虑coins的顺序(因为不管什么顺序,dp数组都是从小算到大的)。
代码
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount+1];
// 状态设置为不可达
for(int i = 0; i < dp.length; i++)
dp[i] = -1;
// 金额为0的最优解为0
dp[0] = 0;
for(int i = 1; i <= amount; i++) {
for(int j = 0; j < coins.length; j++) {
// dp[i]的前一个状态需要不为-1:要能达到。
if(i - coins[j] >= 0 && dp[i-coins[j]] != -1) {
if(dp[i] == -1 || dp[i] > dp[i-coins[j]] + 1) {
dp[i] = dp[i-coins[j]] + 1;
}
}
}
}
return dp[amount];
}
}
复杂度
时间复杂度O(amount * coins)
空间复杂度O(amount)