C++ day45 爬楼梯 零钱兑换 完全平方数

题目1:70 爬楼梯(进阶版)

题目链接:爬楼梯

对题目的理解

需要爬n阶才能到达楼顶,每次可以至多爬m个台阶,m的区间是[1,n),有多少种方法爬到楼顶

本题是一个完全背包问题,每一阶都可以重复使用,例如跳了1阶,还可以继续跳1阶,1、2 步 和 2、1 步都是上三个台阶,但是这两种方法不一样!

1阶,2阶,.... m阶就是物品,楼顶就是背包

跳到楼顶有几种方法其实就是问装满背包有几种方法

动规五部曲

1)dp数组及下标i的含义

dp[j]表示容量为j的背包的最大价值

本题的含义就是:走到第j阶楼梯,有几种走法,最终求的是dp[n]

2)递推公式

dp[j]+=dp[j-i]   i代表本次走的阶梯数   

3)dp数组初始化

dp[0]=1,因为递推公式是递加的,如果初始化为0的话,那么dp数组全为0,初始化为1,相当于初始化了根基,其余下标为非零的dp[j]初始化为0,因为递推公式是递加的关系,所以初始化为0,才能不掩盖求得的dp数组的值

4)遍历顺序

因为本题求的是完全背包的排列问题,所以需要先正序遍历背包,后正序遍历物品,这样才可以求得最终的排列

5)打印dp数组

代码

#include<iostream>
#include<vector>
using namespace std;
int main(){int n,m;cin>>n>>m;//定义并初始化dp数组vector<int> dp(n+1,0);dp[0]=1;//递推,排列问题,先正序遍历背包,后正序遍历物品for(int j=1;j<=n;j++){for(int i=1;i<=m;i++){if(j>=i) dp[j]+=dp[j-i];}}cout<<dp[n]<<endl;
}
  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n)

题目2:322 零钱兑换

题目链接:零钱兑换

对题目的理解

整数数组coins中的每个元素代表不同面额的硬币,整数amount表示总金额

返回可以凑成总金额所需的最少的硬币数,如果没有,则-1,其中每种硬币可无限次使用

硬币无限次使用,说明这是典型的完全背包问题

动规五部曲

1)dp数组及下标i的含义  

装满容量为j的背包,最少物品个数为dp[j]   最终要求dp[amount]

2)递推公式

dp[j]=min(dp[j],dp[j-coins[i]]+1)   因为放入一个物品,减去coins[i],但是个数要加1,

3)dp数组初始化

dp[0]=0  测试用例已给出    对于非零下标 考虑到递推公式, 本题因为求的是二者的最小值,所以将dp[j]初始化为最大值INT_MAX,这样递推式得到的值才不会被覆盖

4)遍历顺序

本题求的是最小硬币数,顺序颠不颠倒都无所谓,所以先遍历物品,还是先遍历背包,都行

5)打印dp数组

代码(先遍历物品,后遍历背包)

class Solution {
public:int coinChange(vector<int>& coins, int amount) {//定义并初始化dp数组vector<int> dp(amount+1,INT_MAX);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]=min(dp[j],dp[j-coins[i]]+1);}}if(dp[amount]==INT_MAX) return -1;return dp[amount];}
};
  • 时间复杂度: O(n * amount),其中 n 为 coins 的长度
  • 空间复杂度: O(amount)

代码(先遍历背包后遍历物品)

class Solution {
public:int coinChange(vector<int>& coins, int amount) {//定义并初始化dp数组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) dp[j]=min(dp[j],dp[j-coins[i]]+1);}}if(dp[amount]==INT_MAX) return -1;return dp[amount];}
};
  • 时间复杂度: O(n * amount),其中 n 为 coins 的长度
  • 空间复杂度: O(amount)

题目3:279 完全平方数

题目链接:完全平方数

对题目的理解

返回和为n的完全平方数的最小数量,其中完全平方数可以重复使用,因此是一个完全背包问题

完全平方数是物品,n是背包

任何一个数都可以凑成完全平方数的总和,因为完全平方数有1

动规五部曲

1)dp数组及下标i的含义

dp[j]:背包容量为j时,完全平方数的最小数量是dp[j]   最终求的是dp[n]

2)递推公式

我怎么表示完全平方数呢?使用i*i

dp[j]=min(dp[j-i*i]+1,dp[j])

3)dp数组初始化

dp[0]=0  因为题目给的n至少是1,根据递推公式,dp[0]要从0开始,这样才能继续向下推导,而根据递推公式,求得是二者的最小值,所以将非零下标对应的dp[j]初始化为最大值INT_MAX

4)遍历顺序

本题求的也是最少数量,与顺序无关,所以先遍历物品,还是先遍历背包均可

5)打印dp数组

代码(先遍历物品后遍历背包)

class Solution {
public:int numSquares(int n) {//定义并初始化dp数组vector<int> dp(n+1,INT_MAX);dp[0]=0;//递推for(int i=1;i*i<=n;i++){for(int j=i*i;j<=n;j++){dp[j]=min(dp[j],dp[j-i*i]+1);}}return dp[n];//注意本题不像上一题,有不存在的现象,任何一个数都会由若干个完全平方数组成    }
};
  • 时间复杂度: O(n * √n)
  • 空间复杂度: O(n)

代码(先遍历背包后遍历物品)

class Solution {
public:int numSquares(int n) {//定义并初始化dp数组vector<int> dp(n+1,INT_MAX);dp[0]=0;//递推for(int j=0;j<=n;j++){for(int i=1;i*i<=n;i++){if(j>=i*i) dp[j]=min(dp[j],dp[j-i*i]+1);}}return dp[n];//注意本题不像上一题,有不存在的现象,任何一个数都会由若干个完全平方数组成    }
};
  • 时间复杂度: O(n * √n)
  • 空间复杂度: O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

史上最全接单平台集锦,程序员不容错过!

非典型程序员不是每天都累成狗&#xff0c;天天”996"甚至”007“。可能&#xff0c;面临着上班摸鱼没事干&#xff0c;下班躺尸打游戏的无聊境况。那么&#xff0c;如果你也是这样的程序员&#xff0c;有没有什么安排可以打发时间&#xff1f; 闲着还不如挣钱~心情好的时…

uniapp 使用 flex布局 将 图片展示 循环排列两列

将以下代码改成图片展示 循环排列两列 展示 <template><view><image v-for"(image, index) in imageList" :key"index" :src"image"></image></view> </template><script> export default {data() {…

【QML】qml+gstreamer显示的同时录像,避免卡顿

1. 问题 使用QML的CameravideoRecorder(Camera)VideoOutput实现显示加录像功能。在Ubuntu上运行正常&#xff0c;视频流畅。但是在开发板上&#xff08;RK3568&#xff09;上出现明显卡顿&#xff0c;无法正常录像。 2. 解决方案 将摄像头数据通过gstreamer共享内存到某个位…

cddd 安装指南(pip install cddd)

pip install cddd 这个命令可能会报错&#xff0c;因为要求是TensorFlow1.10.0 TensorFlow1.10.0对应的Python版本是3.6&#xff0c;所以如果你的Python版本是3.6以上是不行的.....

PTApt——2023年软件设计综合实践_7(数据结构)

6-1 递增的整数序列链表的插入 本题要求实现一个函数&#xff0c;在递增的整数序列链表&#xff08;带头结点&#xff09;中插入一个新整数&#xff0c;并保持该序列的有序性。 答案&#xff1a; 语言选C(gcc) List Insert(List L, ElementType X) {List tmp (List) mal…

142. 环形链表 II --力扣 --JAVA

题目 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使…

OpenCV实现手势音量控制

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何使用OpenCV实现手势音量控制&#xff0c;欢迎大家一起前来探讨学习~ 一、需要的库及功能介绍 本次实验需要使用OpenCV和mediapipe库进行手势识别&#xff0c;并利用手势距离控制电脑音量。 导入库&am…

Python内置函数与标准库函数的详细解读

一、内置函数与标准库函数的区分 Python 解释器自带的函数叫做内置函数&#xff0c;这些函数可以直接使用&#xff0c;不需要导入某个模块。 Python 解释器也是一个程序&#xff0c;它给用户提供了一些常用功能&#xff0c;并给它们起了独一无二的名字&#xff0c;这些常用功能…

JSP 9大内置对象详解

一、内置对象特点: 1.由JSP规范提供,不用编写者实例化。 2. 通过Web容器实现和管理 3.所有JSP页面均可使用 4.只有在脚本元素的表达式或代码段中才可使用(<%使用内置对象%>或<%使用内置对象%>) 二、常用内置对象: 1.输出输入对象:request对象、response对象、…

C++初阶 | [五] 内存管理

摘要&#xff1a;new and delete&#xff0c;定位new&#xff0c;&#xff08;C内存管理的方式&#xff09;&#xff0c;malloc/free和new/delete的区别&#xff0c;内存泄漏 关于内存&#xff1a; 栈又叫堆栈——非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长…

华为OD机试 - 园区参观路径(Java JS Python C)

题目描述 园区某部门举办了Family Day,邀请员工及其家属参加; 将公司园区视为一个矩形,起始园区设置在左上角,终点园区设置在右下角; 家属参观园区时,只能向右和向下园区前进,求从起始园区到终点园区会有多少条不同的参观路径。 输入描述 第一行为园区的长和宽; 后…

Linux详解——安装JDK

目录 一、下载jdk 二、tar包安装 三、rpm包安装 一、下载jdk 1.下载jdk https://www.oracle.com/technetwork/java/javase/downloads/index.html 2.通过CRT|WinSCP工具将jdk上传到linux系统中 二、tar包安装 # 1.将JDK解压缩到指定目录 tar -zxvf jdk-8u171-linux…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-12:内存管理)

学习之路主要为FreeRTOS操作系统在STM32F103&#xff08;STM32F103C8T6&#xff09;上的运用&#xff0c;采用的是标准库编程的方式&#xff0c;使用的IDE为KEIL5。 注意&#xff01;&#xff01;&#xff01;本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

苍穹外卖--查看,删除购物车

代码开发 Controller层 在ShoppingCartController中创建查看购物车的方法&#xff1a; /*** 查看购物车* return*/GetMapping("/list")ApiOperation("查看购物车")public Result<List<ShoppingCart>> list(){return Result.success(shopping…

VituralBox学习

vagrant box add BOX镜像文件位置及名称 --name [文件夹名称] vagrant init 多个 vagrant box add [box文件夹] BOX镜像文件位置及名称 cd [box文件夹] vagrant init [box文件夹] 生成 Vagrantfile vagrant up 启动 修改ssh配置文件并重启服务&#xff1a; cd /etc/ssh…

MyBatis使用教程详解<下>

回顾上一篇博文,我们讲了如何使用注解/XML的方式来操作数据库,实际上,一个Mapper接口的实现,这两种方式是可以并存的. 上一篇博文中,我们演示的都是比较简单的SQL语句,没有设计到复杂的逻辑,本篇博文会讲解复杂SQL的实现及一些细节处理.话不多说,让我们开始吧. 一. #{}和${} …

CLion安装与配置教程

目录 一、下载并安装CLion1、下载1、官网&#xff1a;2、注意&#xff1a; 2、安装1、下载完成后&#xff0c;直接点击安装包安装&#xff0c;即可。2、开始安装&#xff0c;然后下一步3、可以在此处自定义地址&#xff0c;然后下一步4、根据系统版本选择&#xff0c;然后下一步…

springboot 注解@JsonInclude

修饰 实体属性or实体类 //枚举值&#xff1a;ALWAYS,NON_NULL,NON_ABSENT,NON_EMPTY,NON_DEFAULT,CUSTOM,USE_DEFAULTS JsonInclude(Include.NON_EMPTY)//将该标记放在属性上&#xff0c;如果该属性为NULL则不参与序列化 //如果放在类上边,那对这个类的全部属性起作用 Inclu…

java - 冒泡排序

一、什么是冒泡排序 冒泡排序&#xff08;Bubble sort&#xff09;是一种简单的排序算法&#xff0c;其基本思想是通过相邻元素的比较和交换&#xff0c;将较大的元素逐渐交换到序列的一端&#xff0c;从而达到排序的目的。 具体步骤如下&#xff1a; 从序列的第一个元素开始&a…

WPF-本地保存登录账号密码

一、更新/写入账户和密码 /// <summary> /// 更新设置 /// </summary> /// <param name"settingName"></param> /// <param name"valueName"></param> public static void U…