递推公式 dp[j] = min(dp[j-coins[i]], dp[j]) 但有条件,就是dp[j-coins[i]]要有解。因为是取最小值,所以要把dp初始化为MAX INT 另外, dp[0]应初始化为0.
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] = Integer.MAX_VALUE;
}
dp[0] = 0;
for(int i=0; i<coins.length; i++) {
for(int j=coins[i]; j<=amount; j++) {
if(dp[j-coins[i]] == Integer.MAX_VALUE) {
continue;
}
dp[j] = Math.min(dp[j-coins[i]] + 1, dp[j]);
}
}
if(dp[amount] == Integer.MAX_VALUE) {
return -1;
}
else {
return dp[amount];
}
}
}
279. Perfect Squares 跟前一题差不多。处理好完全平方数的循环终止条件即可。我是放了一个if,在平方数大于n的时候终止循环。
class Solution {
public int numSquares(int n) {
int[] dp = new int[n+1];
for(int i=0; i<dp.length; i++) {
dp[i] = Integer.MAX_VALUE;
}
dp[0] = 0;
for(int i=0; i<=n; i++) {
if(i*i > n) {
break;
}
int ps = i*i;
for(int j=ps; j<=n; j++) {
if(dp[j-ps] == Integer.MAX_VALUE) {
continue;
}
dp[j] = Math.min(dp[j-ps] + 1, dp[j]);
}
}
return dp[n];
}
}