代码随想录训练营第45天|70. 爬楼梯 (进阶,322. 零钱兑换,279.完全平方数
70.爬楼梯
文章
思路
将楼梯长度视为背包容量,将一步的跨度视为物品价值,则可以转化为完全背包问题
代码
java
class Solution {
public int climbStairs(int n) {
int i, j;
int[] dp = new int[n + 1];
dp[0] = 1;
for (j = 0; j < n + 1; ++j) {
for (i = 0; i < 2; ++i) {
if (j >= i + 1) {
dp[j] += dp[j - i - 1];
}
}
}
return dp[n];
}
}
322.零钱兑换
文章
思路
dp数组初始化全为正无穷
dp[0]单独设为0
外层遍历物品,内层遍历背包容积
d p [ j ] = M i n ( d p [ j ] , d p [ j − c o i n s [ i ] ] + 1 ) dp[j]=Min(dp[j], dp[j-coins[i]]+1) dp[j]=Min(dp[j],dp[j−coins[i]]+1)
代码
java
public class Solution {
public int coinChange(int[] coins, int amount) {
int max = amount + 1;
int[] dp = new int[amount + 1];
Arrays.fill(dp, max);
dp[0] = 0;
for (int i = 1; i <= amount; i++) {
for (int j = 0; j < coins.length; j++) {
if (coins[j] <= i) {
dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
}
279.完全平方数
文章
思路
n为背包容量,i^2为物品价值,单个物品最大价值为sqrt(n)
d p [ j ] = M i n ( d p [ j ] , d p [ j − i 2 ] + 1 ) dp[j]=Min(dp[j],dp[j-i^2]+1) dp[j]=Min(dp[j],dp[j−i2]+1)
代码
java
class Solution {
public int numSquares(int n) {
int i, j;
int[] dp = new int[n + 1];
Arrays.fill(dp, n);
dp[0] = 0;
int upper = (int) Math.sqrt(n);
for (i = 1; i <= upper; ++i) {
for (j = 1; j < n + 1; ++j) {
if (j >= i * i) {
dp[j] = Math.min(dp[j], dp[j - i * i] + 1);
}
}
}
return dp[n];
}
}
总结
二刷,还是会出错
牢牢记住,求组合数外层物品内层背包