代码随想录算法训练营第四十五天| ● 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;
}

零钱兑换 

题目链接:322. 零钱兑换 - 力扣(LeetCode)

思路:注意求组合,要先遍历物品,再遍历背包。同时这里有个技巧,由于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];
    }
};

 

posted @ 2024-03-13 16:46  SandaiYoung  阅读(4)  评论(0编辑  收藏  举报