题目 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
题解 动态规划
动态规划:建立一个dp
容器,dp[i]
表示到第i阶的方法数目,分为两种情况:
如果这次选用跳一步:则dp[i] = dp[i - 1];
如果这次选用跳两步:则dp[i] = dp[i - 2];
所以:dp[i] = dp[i - 1] + dp[i - 2];
加上边界条件:dp[1] = 1; dp[2] = 2;
完整代码:
class Solution {
public:
int climbStairs(int n) {
if(n == 1 || n == 2)
return n;
vector<int> dp(n + 1, 0);
dp[1] = 1;
dp[2] = 2;
for(int i = 3; i <= n; ++i){
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[n];
}
};
题目 零钱兑换||
给你一个整数数组 coins
表示不同面额的硬币,另给一个整数 amount
表示总金额。
请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0
。
假设每一种面额的硬币有无限个。
题目数据保证结果符合 32 位带符号整数。
题解 动态规划
实际与爬楼梯问题一样的思路,即总楼梯台阶数目为amount
,每次可以选择跳coins[0]、coins[1]....coins[coins.size()- 1]
步,则可以化为上一题中的上楼梯思路:
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> dp(amount + 1, 0);
dp[0] = 1;
for(int i = 0; i < coins.size(); ++i){
for(int j = coins[i]; j <= amount; ++j){
dp[j] += dp[j - coins[i]];
}
}
return dp[amount];
}
};