爬楼梯 (进阶)
题目详细:LeetCode.70
这道简单题我们可以利用常规动态规划思想来解决,也可以利用完全背包来解决。
详细的题解可查阅:《代码随想录》— 爬楼梯
Java解法(动态规划,完全背包):
class Solution {
public int climbStairs(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
for(int i = 1; i <= n; i++){
for(int j = 1; j <= 2; j++){
if(i >= j)
dp[i] += dp[i - j];
}
}
return dp[n];
}
}
零钱兑换
题目详细:LeetCode.322
详细的题解可查阅:《代码随想录》— 零钱兑换
Java解法(动态规划,完全背包):
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
// 为求硬币个数最少的组合数,所以需要初始化为最大值
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0; // if(amount == 0)
for(int i = 0; i < coins.length; i++){
for(int j = coins[i]; j <= amount; j++){
// 注意:当dp[j - coins[i]]为初始值时,需要先跳过
if(dp[j - coins[i]] != Integer.MAX_VALUE)
dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1);
}
}
return dp[amount] == Integer.MAX_VALUE ? -1 : dp[amount];
}
}
完全平方数
题目详细:LeetCode.279
详细的题解可查阅:《代码随想录》— 完全平方数
Java解法(动态规划,完全背包):
class Solution {
public int numSquares(int n) {
int[] dp = new int[n + 1];
Arrays.fill(dp, Integer.MAX_VALUE);
dp[0] = 0;
// 先遍历背包
for(int i = 0; i <= n; i++){
// 再遍历数字
for(int j = 1; j*j <= i; j++){
dp[i] = Math.min(dp[i], dp[i - j*j] + 1);
}
}
return dp[n];
}
}