C++ day43 最后一块石头的重量 目标和 一和零

题目1:1049 最后一块石头的重量

题目链接:最后一块石头的重量

对题目的理解

整数数组stone[i]表示第i块石头的重量,每次从中选出任意两块石头(x<=y)粉碎

如果两块石头重量相等,就会被完全粉碎;如果不等,那么重量轻(x)的石头会被粉碎,另一块石头重量变为y-x

每次最多剩下一块石头,返回此石头可能的最小重量,如果没有石头剩下,就返回0

stone数组中的元素在1~100之间,数组长度在1~30之间

每次让数值相近的石头一起粉碎,这样最终得到的重量会减少,本题其实就是尽量让石头分成重量相同的两堆,相撞之后剩下的石头最小,这样就化解成01背包问题了

本题物品的重量是stones[i],物品的价值也是stones[i]

动规五部曲

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

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

本题表示背包中容量是j时,最大重量是dp[j]

2)递推公式

01背包:dp[j]=max(dp[j],dp[j-weight[i]]+value[i])

dp[j]=max(dp[j],dp[j-stones[i]]+stones[i])

3)dp数组初始化

dp[0]=0  ,根据递推公式,非零下标对应的dp[j]也初始化为0,这样才不会覆盖初始值

1 <= stones.length <= 30,1 <= stones[i] <= 100,所以最大重量就是30 * 100 ,但是背包只需要装最大重量的一半即可(因为将石头分成重量相等的两堆),target=sum/2=3000/2=1500

4)遍历顺序

先正序遍历物品,后倒序遍历背包

for(i=0;i<stones.size();i++){

      for(j=target;j>=stones[i];j--)}

5)打印dp数组

最后dp[target]里是容量为target的背包所能背的最大重量,那么分成两堆石头,一堆石头的总重量是dp[target],另一堆就是sum - dp[target],

因为target=sum/2,是直接抹去小数部分,所以sum-dp[target]>=target

最终石头的最小重量是result=(sum-dp[target])-dp[target]

代码

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {//数组长度最大是30,数组中的元素最大是100,所以dp数组承受的最大重量是30*100=3000,分成重量相同的两堆,所以大小是1500+1//dp数组初始化vector<int> dp(1501,0);int sum = 0;for(int i=0;i<stones.size();i++){sum += stones[i];}int target = sum/2;//递推,先正序遍历物品,后倒序遍历背包for(int i=0;i<stones.size();i++){for(int j=target;j>=stones[i];j--){dp[j]=max(dp[j],dp[j-stones[i]]+stones[i]);}}int result = sum-dp[target]-dp[target];return result;}
};
  • 时间复杂度:O(m × n) , m是石头总重量(准确的说是总重量的一半),n为石头块数
  • 空间复杂度:O(m)

题目2:494 目标和

题目链接:目标和

对题目的理解

非负整数数组的每个数字前添加   '+'   或  '-' 得到表达式,计算表达式运算结果等于target的不同表达式的数目

本题还是分成两个部分,加法集合left    减法集合right,这两个集合满足下面的两个等式①②

①  left+right=sum

②  left-right=target

right=sum-left

left-(sum-left)=target-->2left-sum=taget   left=(target+sum)/2     注:只有能整除才能找到

如果不能整除,则不存在这样的元素组合使得运算结果等于target,

如果target的绝对值的大于sum,也是无解的

背包容量是left时,看元素中有多少种方式能够装满这个背包,每个元素只用1次,是01背包问题

动规五部曲

1)dp[j]数组即下标j的含义

背包容量为j时,装满背包有dp[j]种方法

2)递推公式   

递推公式:dp[j] += dp[j-nums[i]]      ,在后面在讲解背包解决排列组合问题的时候还会用到!

3)dp数组初始化

dp[0]=1,如果数组[0] ,target = 0,那么 left = (target + sum) / 2 = 0, dp[0]也应该是1, 也就是说给数组里的元素 0 前面无论放加法还是减法,都是 1 种方法。

根据递推公式 因为递推公式是累加的,dp[j]要保证是0的初始值,才能正确的由dp[j - nums[i]]推导出来。,所以非零下标的dp[j]初始为0

4)遍历顺序

01背包:正序遍历物品(元素),倒序遍历背包(left)

5)打印dp数组

代码

class Solution {
public:int findTargetSumWays(vector<int>& nums, int target) {int sum=0;for(int i=0;i<nums.size();i++){sum += nums[i];}int left = (target+sum)/2;//dp数组里面尽可能地装left容量   -500~1000if((target+sum)%2==1) return 0;if(abs(target)>sum) return 0;//初始化dp数组vector<int> dp(left+1,0);dp[0]=1;//递推for(int i=0;i<nums.size();i++){for(int j=left;j>=nums[i];j--){dp[j] += dp[j-nums[i]];}}return dp[left];}
};
  • 时间复杂度:O(n × m),n为正数个数,m为背包容量
  • 空间复杂度:O(m),m为背包容量

本题记住:装满背包有几种方法,递推公式为

dp[j] += dp[j-nums[i]];

题目3:474一和零

题目链接:一和零

对题目的理解

返回二进制字符串数组strs最大子集长度,该子集中最多有m个0和n个1,二进制字符串仅由0,1组成

题目要求:strs字符串数组中至少有1个字符串,最多有600个字符串;每个字符串的长度至少为1,最多是100

背包有两个维度,m个0和n个1,装满这个背包有多少个物品

不同长度的字符串就是不同大小的待装物品,每个物品只能使用1次,所以是01背包问题

动规五部曲

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

二维dp数组,dp[i][j]  装满i个0,j个1的背包最多背了dp[i][j]个物品

2)递推公式

01背包递推公式:dp[j]=max(dp[j],dp[j-weight[i]]+value[i])

每个物品的重量是x个0,y个1,是两个维度,所以递推公式为dp[i][j]=max(dp[i][j], dp[i-x][j-y]+1)

3)dp数组初始化

dp[0][0]=0   非零下标 ,若初始化为一个较大的正整数,那么根据递推公式,值会被覆盖掉

所以非零下标的dp[j]也初始化为非负整数的最小值,即0

4)遍历顺序

01背包:先正序遍历物品strs里的字符串,后倒序遍历背包(两个维度,m和n)

5)打印dp数组

代码

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {//定义并初始化dp数组,这个数组是一个二维数组,有这两个重量0和1vector<vector<int>> dp(m+1,vector<int>(n+1,0));//递推,先正序遍历物品,后倒序遍历背包for(string str:strs){//遍历物品(字符串数组)int x=0;//记录当前字符串中0的个数int y=0;//记录当前字符串中1的个数for(char c:str){//遍历字符串中的每个字符,统计字符串中0和1的数量if(c=='0') x++;else y++;}        for(int i=m;i>=x;i--){//遍历背包for(int j=n;j>=y;j--){dp[i][j]=max(dp[i][j],dp[i-x][j-y]+1);}}}return dp[m][n];}
};
  • 时间复杂度: O(kmn),k 为strs的长度
  • 空间复杂度: O(mn)

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

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

相关文章

实在品牌墙又双叒叕扩容,数十家龙头品牌签约实在RPA

近日&#xff0c;“实在智能 华夏行”数智化赋能之旅火爆前行&#xff0c;为孩子王、视客眼镜、心海伽蓝、洁丽雅、诗裴丝、视贝、博纳泉、鑫荣懋、艾莱得、布诗等数十家优秀企业带来超自动化智能解决方案&#xff0c;帮助商家解决重复低效工作&#xff0c;降低运营成本&#x…

RFC4493——AES-CMAC

文章目录 Abstract1 Introduction2 Specification of AES-CMAC2.1 Basic Definitions2.2 Overview2.3 Subkey Generation Algorithm2.4 MAC Generation Algorithm2.5 MAC Verification Algorithm 3 Security Considerations4 Test Vectors5 测试代码5.1 C语言版本5.2 Python语言…

阿里健康再得阿里巴巴资产注入 实现“自营+佣金+营销”多轮驱动

11月28日晚间&#xff0c;阿里健康发布公告宣布&#xff0c;正式与阿里巴巴集团签署股权认购协议&#xff0c;以135.12亿港元对价&#xff0c;获得阿里妈妈医疗健康类目的独家营销审核权及附属权利。交易完成后&#xff0c;阿里巴巴集团在阿里健康的持股比例将从56.99%上升到63…

鸿蒙原生应用/元服务开发-AGC分发如何下载管理Profile

一、收到通知 尊敬的开发者&#xff1a; 您好&#xff0c;为支撑鸿蒙生态发展&#xff0c;HUAWEI AppGallery Connect已于X月XX日完成存量HarmonyOS应用/元服务的Profile文件更新&#xff0c;更新后Profile文件中已扩展App ID信息&#xff1b;后续上架流程会检测API9以上Harm…

RHCE第五次作业

目录 1.算数运算命令有哪几种&#xff1f; 1.&#xff08;&#xff08;&#xff09;&#xff09; 2&#xff0c;let 3.[] 4.declare -i 5.expr 6.bc 7.awk 总结&#xff1a; 2..定义变量urlhttps://blog.csdn.net/weixin_45029822/article/details/10356881…

springboot集成springsecurity

转载自&#xff1a;www.javaman.cn 1、整合springsecurity 添加pom.xml <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId> </dependency>2、springsecurity认证授权流程…

OpenCV | 模版匹配

import cv2 #opencv读取的格式是BGR import numpy as np import matplotlib.pyplot as plt#Matplotlib是RGB %matplotlib inline 模版匹配 模版匹配和卷积原理很像&#xff0c;模版在原图像上从原点开始滑动&#xff0c;计算模版与&#xff08;图像被模版覆盖的地方&#xff…

go标准库

golang标准库io包 input output io操作是一个很庞大的工程&#xff0c;被封装到了许多包中以供使用 先来讲最基本的io接口 Go语言中最基本的I/O接口是io.Reader和io.Writer。这些接口定义了读取和写入数据的通用方法&#xff0c;为不同类型的数据源和数据目标提供了统一的接…

同旺科技 USB 转 RS-485 适配器 -- 隔离型(定制款)

内附链接 1、USB 转 RS-485 适配器 隔离版主要特性有&#xff1a; ● 支持USB 2.0/3.0接口&#xff0c;并兼容USB 1.1接口&#xff1b; ● 支持USB总线供电&#xff1b; ● 支持Windows系统驱动&#xff0c;包含WIN10 / WIN11 系统32 / 64位&#xff1b; ● 支持Windows …

一文例说嵌入式 C 程序的内聚和耦合

1 - 原理篇 低耦合&#xff0c;是指模块之间尽可能的使其独立存在&#xff0c;模块之间不产生联系不可能&#xff0c;但模块与模块之间的接口应该尽量少而简单。这样&#xff0c;高内聚从整个程序中每一个模块的内部特征角度&#xff0c;低耦合从程序中各个模块之间的关联关系…

多个加速度计/麦克风连接指引

座舱内的振动投诉&#xff1a;如乘客/驾驶员在车厢内感受到传动轴、方向盘抖动剧烈 图1.三轴模式下的单个加速度计 图2.软件设置界面 如果您只有一个加速度计&#xff0c;可以在三轴模式下使用一个加速度计找出客户投诉车厢内振动最强烈的区域。例如将加速度计连接到驾驶员座椅…

对接电商平台高效获取各大电商平台数据,商品详情数据代码示例

电商可以通过使用API接口获取商品信息数据。API是应用程序编程接口的缩写&#xff0c;它允许程序之间进行通信和数据传输。为了获取商品信息数据&#xff0c;电商可以利用API接口向商品供应商的数据库发送请求&#xff0c;然后接收并解析返回的数据。 具体来说&#xff0c;电商…

​ 数据库开发海外服务器选择:一篇教程看懂Amazon EC2开发环境搭建

大家的数据库之类的开发环境都是安装在哪的呢&#xff1f;平时开发用的数据库有时候回家还想要用一下&#xff0c;就需要远程到公司的电脑把数据库导出来&#xff0c;然后将文件下载到家里的电脑并导入家里电脑的数据库里&#xff0c;着实麻烦&#xff0c;或者选择内网穿透或虚…

解决api-ms-win-crt-runtime-l1-1-0.dll丢失的问题,全是干货分享

今天我的电脑中突然出现关于“api-ms-win-crt-runtime-l1-1-0.dll”的错误提示&#xff0c;关闭提示后再次打开程序依然不能正常打开&#xff0c;出现这样的问题突然不知道是因为什么&#xff0c;于是就去了解了关于出现api-ms-win-crt-runtime-l1-1-0.dll错误的问题&#xff0…

去北京医院预约,需要医保卡号,但是社保卡不在身边,北京的医保卡号咋网上查询

目录 1 问题2 查询 1 问题 要去北京某一个医院预约挂号&#xff0c;预约的时候选择的医保&#xff0c;需要写医保卡号&#xff0c;但是自己的社保卡不在身边&#xff0c;怎么办 记住&#xff0c;医保卡号不是社保卡号&#xff0c;是不一样的 北京医保卡号是12位 2 查询 登陆这…

LeetCode2514.统计同位异构字符串数目

题目简单&#xff0c;关键是灵茶山艾府的代码写起来太优美&#xff0c;不得不记录一下 const int Mod 1e97; using ll long long; ll qmi(ll a,ll b,ll mod){ll res 1;while(b){if(b&1)res res*a%mod;aa*a%mod;b>>1;}return res; }class Solution { public:int c…

XMind思维导图:掌握思维之翼,激发无限创造力

在当今快速发展的信息时代&#xff0c;高效地表达和梳理思维显得尤为重要。在这个背景下&#xff0c;XMind作为一款思维导图软件&#xff0c;以其独特的优势脱颖而出。它不仅在Mac和Windows平台上均可使用&#xff0c;还以其人性化的设计和强大的功能&#xff0c;成为了思维导图…

2023亚马逊云科技re:Invent,在开发者板块探究如何利用技术重塑业务

美国当地时间11月27日&#xff0c;一年一度的亚马逊云科技re:Invent大会在美国拉斯维加斯盛大开幕。这场全球云计算领域的前沿盛会&#xff0c;已连续12年成为引领行业的风向标。那么本次2023亚马逊云科技re:Invent大会又有哪些可玩、可看的新项目&#xff0c;下面就一起来瞧一…

【AIGC】关于Prompt你必须知道的特性

代码和数据:https://github.com/tonyzhaozh/few-shot-learning 一、实践验证的大模型的特性 1. 大模型的偏差 示例&#xff1a;&#xff08;文本的情感分析&#xff1a;一句话->P(积极&#xff09;或者N&#xff08;消极) Input: I hate this movie. Sentiment: Negativ…

查看mysql 或SQL server 的连接数,mysql超时、最大连接数配置

1、mysql 的连接数 1.1、最大可连接数 show variables like max_connections; 1.2、运行中连接数 show status like Threads_connected; 1.3、配置最大连接数&#xff0c; mysql版本不同可配置的最大连接数不同&#xff0c;mysql8.0的版本默认151个连接数&#xff0c;…