首页 > 其他分享 >(45/60)爬楼梯进阶、零钱兑换、完全平方数

(45/60)爬楼梯进阶、零钱兑换、完全平方数

时间:2024-03-21 23:57:43浏览次数:19  
标签:coins 进阶 int MAX 45 number 60 vector dp

day45

爬楼梯进阶

卡码网:爬楼梯(第八期模拟笔试)

动态规划

代码实现

/*
总和为j总共有dp[j]种方法(可重复选取、排列)
dp[j] += dp[j-nums[i]
dp[0] = 1;其余为0
先背包再物品,正序
*/
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int main(){
    int n = 0;  // n阶(总和)
    int m = 0;  // 一次爬1~m阶
    cin>>n; cin>>m;
    vector<int> dp(n+1,0);
    dp[0] = 1;
    // 先背包再物品
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            if(i >= j) dp[i] += dp[i - j];
        }
    }
    
    cout<<dp[n];
    
    return 0;
}

零钱兑换

leetcode:322. 零钱兑换

动态规划

注意点

  1. 初始化为INT32_MAX - 1,因为递推判断的时候+1可能会溢出 / 或者dp[j - coins[i]]是初始值则跳过
  2. 求最小硬币数,是排列数、组合数都没关系,遍历先后顺序无所谓

代码实现

class Solution {
public:
/*
可重复
意义:装满容量为j的背包,最小硬币数为dp[j]
递推:dp[j] = min(dp[j - coins[i]],dp[j]);
初始化:dp[0] = 0; 其余为INT32_MAX;
遍历:遍历先后无所谓,可重复要正序
*/
    int coinChange(vector<int>& coins, int amount) {
        vector<int> dp(amount + 1,INT32_MAX - 1 );
        dp[0] = 0;
        for(int i = 0;i < coins.size();i++){
            for(int j = coins[i];j <= amount;j++){
                 if (dp[j - coins[i]] != INT_MAX) { // 如果dp[j - coins[i]]是初始值则跳过
                    dp[j] = min(dp[j - coins[i]] + 1, dp[j]);
                }
            }
        }
        if(dp[amount] == INT32_MAX - 1) return -1;
        return dp[amount];
    }
};

TS:

function coinChange(coins: number[], amount: number): number {
    const dp:number[] = new Array(amount + 1).fill(Number.MAX_VALUE);
    dp[0] = 0;
    for(let i = 0;i < coins.length;i++){
        for(let j = coins[i];j <= amount;j++){
            if(dp[j - coins[i]] !== Number.MAX_VALUE)
                dp[j] = Math.min(dp[j - coins[i]] + 1,dp[j]);
        }
    }
    if(dp[amount] === Number.MAX_VALUE) return -1;
    return dp[amount];
};

完全平方数

leetcode:

动态规划

代码实现

/*
意义:装满容量为j的背包的最少物品数为dp[j](可重复取)
递推:dp[j] = min(dp[j - nums[i]] + 1,dp[j])
初始化:初始化为MAX
遍历:物品数,排列、组合无所谓;可重复取,正序
*/

class Solution {
public:
    int numSquares(int n) {
        vector<int> dp(n+1,INT32_MAX);
        dp[0] = 0;  // 雪球起点,没有意义但必须要有才能滚起来
        for(int i = 1;i*i <= n;i++){
            for(int j = i*i;j <= n;j++){
                if(dp[j - i*i] != INT32_MAX){
                    dp[j] = min(dp[j - i*i] + 1,dp[j]);
                    // cout<<dp[j]<<" ";
                }
            }
            // cout<<endl;
        }

        if(dp[n] == INT32_MAX) return -1;
        return dp[n];
    }
};

TS:

function numSquares(n: number): number {
    const dp:number[] = new Array(n + 1).fill(Number.MAX_VALUE);
    dp[0] = 0;
    for(let i = 1;i*i <= n;i++){
        for(let j = i*i;j <= n;j++){
            if(dp[j - i*i] !== Number.MAX_VALUE){
                dp[j] = Math.min(dp[j - i*i] + 1,dp[j]);
            }
        }
    }

    if(dp[n] === Number.MAX_VALUE) return -1;
    else return dp[n];
};

标签:coins,进阶,int,MAX,45,number,60,vector,dp
From: https://www.cnblogs.com/tazdingo/p/18088505

相关文章

  • (44/60)完全背包、零钱兑换Ⅱ、组合总和Ⅳ
    day44完全背包卡码网:携带研究材料(第七期模拟笔试)动态规划思路完全背包,物品可以无限次取,正序遍历。复杂度分析时间复杂度:O(N^2)。空间复杂度:O(N)。代码实现#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;/*给j的容量可重复选择的最......
  • (51/60)买卖股票的最佳时机含冷冻期、买卖股票的最佳时机含手续费
    day51买卖股票的最佳时期含冷冻期leetcode:309.买卖股票的最佳时机含冷冻期动态规划代码实现/*意义:下标为i时各种情况的收益dp[i][0]持有dp[i][1]当天卖出dp[i][2]之前不持有递推:dp[i][0]=max(dp[i-1][0],dp[i-1][2]-prices[i]);//之前持有、之前不持有且当......
  • (50/60)买卖股票的最佳时机Ⅲ、买卖股票的最佳时机Ⅳ
    day50买卖股票的最佳时机Ⅲleetcode:123.买卖股票的最佳时机III动态规划代码实现/*意义:下标为i时,不同状态收益为dp[i][0]未持有dp[i][1]第一次持有dp[i][2]第一次未持有dp[i][3]第二次持有dp[i][4]第二次未持有递推:dp[i][0]=dp[i-1][0];之前未持有dp[i]......
  • (48/60)买卖股票的最佳时机、买卖股票的最佳时机Ⅱ
    day48买卖股票的最佳时机leetcode:121.买卖股票的最佳时机动态规划代码实现/*意义:dp[i][0]下标为i天持有股票的最大收益;dp[i][1]下标为i天不持股的最大收益递推:之前买入、当天买入:dp[i][0]=max(dp[i-1][0],-prices[i]);之前卖出、当天卖出:dp[i][1]=max(dp[i-1][1],......
  • (47/60)打家劫舍、打家劫舍Ⅱ、打家劫舍Ⅲ
    day47打家劫舍leetcode:198.打家劫舍动态规划代码实现/*偷到下标为i的最大金额数为dp[i]偷i、不偷i:dp[i]=max(dp[i-2]+nums[i],dp[i-1]);dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);正序遍历*/classSolution{public:introb(vector<int>&nums){......
  • [ABC345D] Tiling 位运算の极致运用
    [ABC345D]Tiling原题解地址:EditorialbyKiri8128神写法。将\(H\timesW\)的网格展开为\(H\times(W+1)\)的序列,每行多出来的一格表示换行。W+=1;令\(F(a,b)\)表示长为\(a\),宽为\(b\)的矩形填满网格左上角的状态,直接给出公式,可以模拟检验正确性。i128F(......
  • <爬虫部署,进阶Docker>----第十章 探究一下Docker Compose
    前言:        DockerCompose是一个用于定义和运行多容器应用程序的工具,它提供了一种简化和自动化容器编排的方式。在理解DockerCompose的背景之前,让我们先回顾一下容器化技术的发展。容器化技术的出现使得应用程序的部署和管理变得更加轻松和灵活。容器化通过......
  • [CF845G] Shortest Path Problem? 题解
    [CF845G]ShortestPathProblem?题解注意到如果我们在路径中多走了一个环,那么得到的贡献就是这个环的贡献。对于这种有关环的问题,考虑一棵生成树,这样所有环都可以用一条祖先边和一些树边组成,发现选环走的过程是独立的,考虑把所有环的权值丢进线性基里,然后查询xordist[1]^xor......
  • 二叉树的深度优先遍历(力扣94,144,145)
    文章目录题目前知二叉树的遍历方式有什么?递归和迭代是什么?题解一、思路二、解题方法三、Code总结题目Problem:144.二叉树的前序遍历Problem:94.二叉树的中序遍历Problem:145.二叉树的后序遍历前知二叉树的遍历方式有什么?二叉树主要有两种遍历方式:......
  • 科技赋能生活:KTH1601让垃圾桶“懂”你的需求
    在现代社会,科技的快速发展不仅仅改变了我们的生活方式,甚至连日常生活中的垃圾桶也变得“智能”起来。高性能、低功耗霍尔开关传感器KTH1601,正是让智能垃圾桶能够自动感应、自动开关的关键所在。它是由昆泰芯微电子科技有限公司研发的一款全极磁场检测传感器,具备非常低的功耗......