● 70. 爬楼梯 (进阶)● 322. 零钱兑换 ● 279.完全平方数

● 70. 爬楼梯 (进阶)

题目:57. 爬楼梯

题目描述:

根据示例:

可知1到m的阶数可以重复选择,跳了1阶之后还能跳一阶,所以是完全背包,又因为考虑了顺序问题,所以是完全背包的排列数问题。其实就是和昨天● 377. 组合总和 Ⅳ 一样的做法,我们要组合的和target(背包容量)就是到达楼顶的n阶,物品就是1到m。

在动态规划:494.目标和 (opens new window) 、 动态规划:518.零钱兑换II (opens new window)、动态规划:377. 组合总和 Ⅳ (opens new window)中,求装满背包有几种方法,递推公式一般都是dp[i] += dp[i - nums[j]];

代码如下:

#include<iostream>
#include<vector>
using namespace std;
void countMethod(){
    //多少种排列数,加起来的和target是n;nums数组是1到m
    int n,m;
    cin>>n>>m;
    vector<int> dp(n+1,0);
    dp[0]=1;
    for(int j=0;j<=n;++j){
        for(int i=1;i<=m;++i){  
            if(j>=i)dp[j]+=dp[j-i];
        }
    }
    cout<<dp[n];
}

int main()
{
    countMethod();
    return 0;
}

● 322. 零钱兑换

动规五部曲:

1.DP数组及其下标的含义。dp[j]:凑成金额j最少需要dp[j]个硬币。


2.递推公式。这里和之前不一样,是求最小重量。到现在我们的递推公式已经涉及最大最小价值、排列数、组合数了。

排列组合数使用的是求和公式来统计,最大最小价值就需要考虑放与不放两种情况,然后取max/min值,才能对应最大最小价值。

所以不存放硬币i的时候,凑成现在背包里面金额为j-coins[i]的最少硬币数是dp[j-coins[i]]。因为是求最少硬币数,所以应该比较dp[j](是前j-1轮的最少硬币数)和放入硬币i之后的最少硬币数dp[j-coins[i]]+1,的最小值。

所以递推公式为:dp[j]=min(dp[j],dp[j-coins[i]+1)。


3.DP数组如何初始化。dp[0]肯定是=0。但是其他元素不能和之前一样初始化为0,想想之前最大价值初始化为0是为了不在取max的时候覆盖非0值,那么现在应该取INT_MAX,保证比过程中生成的元素值都大,就不会在取min的时候覆盖他们。


4.遍历顺序。因为元素可以重复取,所以背包应该从左往右遍历。和之前的排列组合不同,这里求的是排列组合中的一个最少的情况,所以物品(硬币)有顺序没有顺序都可以,即先硬币还是先背包都可以。


5.打印DP数组。

输入:coins = [1, 2, 5], amount = 5。

代码如下。然后还要注意有两种情况:总金额amount等于0没有硬币可以组成直接返回0;dp[amount]=初始值说明没有硬币能组成amount直接返回-1。

另外,在min中,dp[j-coins[i]]+1如果dp[j-coins[i]]是INT_MAX,再加1会超出范围,所以要在前面加个条件,等于初始值的话就说明不能组成j-coin[i],跳过。

代码如下:

class Solution {
public:
    int coinChange(vector<int>& coins, int amount) {
        if(amount==0)return 0;
        vector<int> dp(amount+1,INT_MAX);
        dp[0]=0;
        for(int j=0;j<=amount;++j){//先背包
            for(int i=0;i<coins.size();++i){
                if(j>=coins[i] && dp[j-coins[i]]<INT_MAX-1){
                    dp[j]=min(dp[j-coins[i]]+1,dp[j]);}
            }
        }

        if(dp[amount]==INT_MAX)return -1;
        return dp[amount];
    }
};

● 279.完全平方数

1.递推公式和dp[j]定义。和上一道一样也是求最少数量,所以dp[j]和递推公式还是一样的,取min值。

2.遍历顺序。只不过不是多个数加起来,而是多个数的平方加起来。所以物品的重量应该是  1,4,9,……,n  ,最大设置为 n 。所以遍历物品的时候,i的取值应该是1,2,……,根号n,考虑有的数自己就是一个平方数,所以 根号n 需要取到。

发现是完全背包问题,所以背包的遍历顺序从小到大。

3.初始化。同样的,n是0的话数量肯定是0,在初始化dp[0]之前先把所有元素①初始化为INT_MAX,在循环中的语句前面就要加if条件。②初始化为INT_MAX-1,就不用家条件,因为:

dp[n]肯定比n小,所以初始化的值大于n的最大值10^4就是正确的。

4.打印dp数组。

代码如下:

class Solution {
public:
    int numSquares(int n) {
        //物品是1,4,9,……,根号n。闭区间
        vector<int> dp(n+1,INT_MAX-1);
        dp[0]=0;
        for(int i=1;i<=sqrt(n);++i){
            for(int j=i*i;j<=n;++j){    //重量是i的平方
                dp[j]=min(dp[j],dp[j-i*i]+1);   //最少数量,两种情况
            }
        }
        return dp[n];
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/424080.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

排序(4)——堆排序

目录 堆排序&#xff08;回顾&#xff09; 基本思路 代码实现 向下调整排序 AdjustDown 建堆排序 时间复杂度 特性总结 堆排序&#xff08;回顾&#xff09; 重点回顾戳&#x1f449;堆排序 基本思路 堆排序(Heapsort)是指利用堆积树&#xff08;堆&#xff09;这种数…

备战蓝桥杯---动态规划的一些思想1

话不多说&#xff0c;直接看题&#xff1a; 目录 1.双线程DP 2.正难则反多组DP 3.换个方向思考&#xff1a; 1.双线程DP 可能有人会说直接贪心&#xff1a;先选第1条的最优路径&#xff0c;再选第2条最优路径。 其实我们再选第1条时&#xff0c;我们怎么选会对第2条的路径…

【leetcode】有效的括号

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家刷题&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 点击查看题目 思路: 实现栈在上个博客中已经写过&#xff0c;在这就不在赘述 点击进入博客&#xff1a;【数…

vscode如何远程到linux python venv虚拟环境开发?(python虚拟环境、vscode远程开发、vscode远程连接)

文章目录 1. 安装VSCode2. 安装扩展插件3. 配置SSH连接4. 输入用户名和密码5. 打开远程文件夹6. 创建/选择Python虚拟环境7. 安装Python插件 Visual Studio Code (VSCode) 提供了一种称为 Remote Development 的功能&#xff0c;允许用户在远程系统、容器或甚至 Windows 子系统…

LeetCode 2368.受限条件下可到达节点的数目:搜索 + 哈希表

【LetMeFly】2368.受限条件下可到达节点的数目&#xff1a;搜索 哈希表 力扣题目链接&#xff1a;https://leetcode.cn/problems/reachable-nodes-with-restrictions/ 现有一棵由 n 个节点组成的无向树&#xff0c;节点编号从 0 到 n - 1 &#xff0c;共有 n - 1 条边。 给…

Leetcoder Day35| 动态规划part02

62.不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff…

腾讯云幻兽帕鲁游戏存档迁移教程,本地单人房迁移/四人世界怎么迁移存档?

腾讯云幻兽帕鲁游戏存档迁移的方法主要包括以下几个步骤&#xff1a; 登录轻量云控制台&#xff1a;首先&#xff0c;需要登录到轻量云控制台&#xff0c;这是进行存档迁移的前提条件。在轻量云控制台中&#xff0c;可以找到接收存档的服务器卡片&#xff0c;并点击进入实例详情…

2023年12月CCF-GESP编程能力等级认证Scratch图形化编程四级真题解析

一、单选题(共15题,共30分) 第1题 现代计算机是指电子计算机,它所基于的是( )体系结构。 A:艾伦图灵 B:冯诺依曼 C:阿塔纳索夫 D:埃克特-莫克利 答案:B 第2题 默认小猫角色,执行下列程序,以下说法正确的是? ( ) A:舞台上会出现无数个小猫 B:舞台只会出现…

k8s的adm方式部署

1 k8s kubeadm搭建 1.1 k8s kubeadm搭建步骤 kubeadm init 在使用kubeadm方式安装k8s集群是&#xff0c;可根据初始化配置文件或配置参数选项快速的初始化生成一个k8s的master管理平台 kubeadm join 根据kubadm init初始化的提示信息快速的将一个node节点或其他的master节…

新项目,Linux上一键安装MySQL,Redis,Nacos,Minio

大家好&#xff0c;我是 jonssonyan 分享一个我的一个开源项目&#xff0c;这是一个在 Linux 平台上一键安装各种软件的脚本项目&#xff0c;脚本使用 Shell 语言编写&#xff0c;后续还会增加更多软件的一键安装&#xff0c;代码在 GitHub 上全部开源的&#xff0c;开源地址如…

scrapy 中间件

就是发送请求的时候&#xff0c;会经过&#xff0c;中间件。中间件会处理&#xff0c;你的请求 下面是代码&#xff1a; # Define here the models for your spider middleware # # See documentation in: # https://docs.scrapy.org/en/latest/topics/spider-middleware.html…

Java构造方法总结(很清晰)

构造方法扫盲&#xff1a;构造方法就是为了创建对象的 解释&#xff1a;真正创建对象的是 new 这个关键字&#xff0c;Java 虚拟机在创建对象时是有很多步骤的&#xff0c;构造方法只是其中的一步&#xff0c;它的作用是进行成员变量初始化。

怎么优雅地访问ChatGPT

ChatGPT&#xff0c;这颗璀璨的智能结晶&#xff0c;在2022年岁末之际&#xff0c;由OpenAI实验室倾力铸就&#xff0c;犹如夜空中跃动的智慧星辰&#xff0c;点亮了人工智能领域的新纪元。犹如汪洋中的一座灯塔&#xff0c;ChatGPT以其独特的智慧光辉引人注目&#xff0c;然而…

mTLS: openssl创建CA证书

证书可以通过openssl或者keytool创建&#xff0c;在本篇文章中&#xff0c;只介绍openssl。 openssl 生成证书 申请操作流程 生成ca证书私钥, 文件名&#xff1a;ca.key生成ca证书&#xff0c;文件名&#xff1a;ca.crt生成Server/Client 证书私钥&#xff0c;文件名&#x…

<网络安全>《63 微课堂<第3课 旁路部署和串行部署是什么?>》

1、串联和并联概念 串联和并联是物理学上的概念。 串联电路把元件逐个顺次连接起来组成的电路。如图&#xff0c;特点是&#xff1a;流过一个元件的电流同时也流过另一个。 并联电路把元件并列地连接起来组成的电路&#xff0c;如图&#xff0c;特点是&#xff1a;干路的电流…

GO-接口

1. 接口 在Go语言中接口&#xff08;interface&#xff09;是一种类型&#xff0c;一种抽象的类型。 interface是一组method的集合&#xff0c;接口做的事情就像是定义一个协议&#xff08;规则&#xff09;&#xff0c;只要一台机器有洗衣服和甩干的功能&#xff0c;我就称它…

AutoSAR(基础入门篇)13.3-Mcal Dio配置

目录 一、Dio port配置 二、Dio pin配置 一、Dio port配置 同之前的Port一样,双击进入Dio配置界面后会看到几乎差不多的配置界面。General和Port类似,我们不再赘述,主要讲解Dio的配置 1. 其实Dio并没有什么实质的作用,主要起到了一个重命名的功能。双击DioConfig_0进入下…

优选算法|【双指针】|1089.复写零

目录 题目描述 题目解析 算法原理讲解 代码 题目描述 1089. 复写零 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就…

力扣hot100题解(python版41-43题)

41、二叉树的层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]]示例…

STM32 GPIO的几种工作模式

介绍STM32 GPIO的几种工作模式 1、输出模式 STM32的引脚输出有两种方式&#xff1a; 1、推挽输出 2、开漏输出 1.1 推挽输出 当引脚设置为推挽输出时&#xff0c;P-MOS和N-MOS共同配合工作。 当使用HAL库 //该函数的作用就是将P-MOS导通&#xff0c;N-MOS关…