代码随想录算法训练营第四十五天| ● 70. 爬楼梯 (进阶) ● 322. 零钱兑换 ● 279.完全平方数
爬楼梯 (进阶)
题目链接:57. 爬楼梯(第八期模拟笔试) (kamacoder.com)
思路:笑嘻了,直接给默写出来了。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
vector<int> dp(n+1);
dp[0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(j<=i)
dp[i]+=dp[i-j];
}
}
cout<<dp[n];
return 0;
}
零钱兑换
思路:注意求组合,要先遍历物品,再遍历背包。同时这里有个技巧,由于dp的最大值不能超过amount,因为硬币最小是1元,如果我们默认设为MAX_INT,在迭代dp的时候就会溢出。
class Solution {
public:
int coinChange(vector<int>& coins, int amount) {
int max=amount+1;
vector<int> dp(amount+1,max);
if(!amount)return 0;
dp[0]=0;
for(int i=0;i<coins.size();i++){
for(int j=1;j<=amount;j++){
if(j>=coins[i]){
dp[j]=min(dp[j],dp[j-coins[i]]+1);
}
}
}
return dp[amount]<max?dp[amount]:-1;
}
};
完全平方数
题目链接:279. 完全平方数 - 力扣(LeetCode)
思路:和硬币题完全一致,只不过硬币面值发生了变化。
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1,n);
dp[0]=0;
for(int i=1;i<=(int)sqrt(n);i++){
for(int j=1;j<=n;j++){
if(j>=(i*i))
dp[j]=min(dp[j],dp[j-i*i]+1);
}
}
return dp[n];
}
};