代码随想录算法训练营第四十三天| 1049. 最后一块石头的重量 II,494. 目标和,474.一和零

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

思路

        把石头分成重量尽量相同的两堆,这样就能保证最后一块石头的重量最小。转换为01背包问题,重量和价值都是stone。

        ①dp数组,dp[j]表示容量为j的背包可以装的最大价值为dp[j]

        ②递推公式,dp[j] = max(dp[j], dp[j - stone[i]] + stone[i])

        ③dp数组初始化,遍历stone数组,计算总重量,取一半为dp数组大小,值为0;或者根据题目可知最大重量为30*100=30000,取一半15000即可,值为0

        ④遍历顺序,一维dp数组,先物品,后背包,背包倒序遍历

        ⑤推导dp数组

代码

class Solution {
public:int lastStoneWeightII(vector<int>& stones) {if (stones.size() == 1)return stones[0];int sum = 0;// 计算总重量for (int a : stones)sum += a;int target = sum / 2;vector<int> dp(target + 1, 0);// 先物品for (int i = 0; i < stones.size(); i++) {// 后背包for (int j = target; j >= stones[i]; j--) {// 01背包dp[j] = max(dp[j], dp[j - stones[i]] + stones[i]);}}// 分成两堆,一堆dp[target],另一堆sum-dp[target]return sum - dp[target] - dp[target];}
};

题目链接:494. 目标和

思路

        数组中有若干数字,在每个数字前面放加号或者减号使得最后的结果为target,可以理解为组合问题,使用回溯算法。每次遇到数字都是两种选择,如果最后等于目标,方法种类做累加操作。这种方法的问题在于时间复杂度,每次都是两种选择,并且数组中有若干数字,时间复杂度呈指数增长。

        既然有加减两种运算符,那就将数组分为两个子集,加法子集left,减法子集right,数组所有数字之和为sum,则sum = left + right,target = left - right,联立两式可得left = (sum+target)/2,如此只需要在数组中寻找若干数字,使其和等于left即可,剩下的就是减法子集。将问题转化成了01背包问题。

        ①dp数组,dp[j]表示装满容量为j的背包有dp[j]种方法

        ②递推公式,dp[j] += dp[j-nums[i]],举例,left=5时,装满需要dp[5],而dp[5]可以由dp[4]+dp[1]得到,以此类推

        ③dp数组初始化,dp[0] = 1,因为要进行累加操作,所以dp[0]取1

        ④遍历顺序,先物品,后背包,背包倒序遍历

        ⑤推导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];}// 目标值的绝对值比数组中所有数字和还要大,肯定无解if (abs(target) > sum)return 0;// 不能整除,说明如何构造都满足不了题目要求if ((sum + target) % 2 == 1)return 0;int left = (sum + target) / 2; // 背包容量vector<int> dp(left + 1, 0);dp[0] = 1; // dp数组初始化// 先物品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];}
};

题目链接:474.一和零

思路

        01背包的思路,数组中由若干物品,重量有两个维度,0的个数,1的个数;背包的容量也有两个维度,0和1的容量,m和n,最后求的是背包最多可以装多少件物品。

        重量及容量涉及两个维度,加上所求的物品数量,总共三个变量,所以使用二维dp数组。

        ①dp数组,dp[i][j]表示容量为i个0和j个0的背包最多可以装dp[i][j]件物品

        ②递推公式,dp[i][j] = max(dp[i][j], dp[i-x][j-y] + 1),x表示当前物品0的个数,y表示当前物品1的个数

        ③dp数组初始化,dp[0][0]=0,容量都为0,装不了物品;dp数组中非0容量也初始化为0,这是因为在递推公式中涉及到max取最大值

        ④遍历顺序,先物品,后背包,背包倒序遍历

        ⑤推导dp数组

代码

class Solution {
public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0)); // dp数组及初始化// 01背包// 先物品for (string str : strs) {int x = 0; // 记录当前物品0的数量int y = 0; // 记录当前物品1的数量for (char a : str) {if (a == '0')x++;elsey++;}// 后背包,这里有两个维度0和1,倒序遍历for (int i = m; i >= x; i--) {for (int j = n; j >= y; j--) {dp[i][j] = max(dp[i - x][j - y] + 1, dp[i][j]);}}}return dp[m][n];}
};

总结

        ①01背包的基础知识已经理解了,但是如何将题目转换为01背包问题还需要熟练

        ②目前来说,将题目转换为01背包问题,主要是要找到背包与物品,然后确定每种物品只有一件

        ③01背包问题:装满背包的组合有多少种,最多能装多少件物品等

        ④dp数组含义以及递推公式的细节处理

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

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

相关文章

探索Linux目录结构:深入理解Linux文件系统

探索Linux目录结构&#xff1a;深入理解Linux文件系统 Linux操作系统以其强大的稳定性和灵活性而闻名&#xff0c;其中一个关键特征就是其独特的文件系统结构。深入了解Linux目录结构对于系统管理员和开发人员至关重要。本文将带您深入探索Linux文件系统的目录结构&#xff0c…

透明加密软件选哪个好?选择时一定要注意以下三点

透明加密软件哪个好&#xff1f; 这是许多企事业单位在面临数据防泄漏问题时经常思考的问题。随着信息技术的发展&#xff0c;企业的数据安全变得越来越重要。透明加密技术作为一种有效的数据保护手段&#xff0c;被越来越多的企业所采用。然而&#xff0c;市场上的透明加密软…

delphi获取进程版本信息

结构体声明 typeTFileInfo packed recordCommpanyName: widestring;FileDescription: widestring;FileVersion: widestring;InternalName: widestring;LegalCopyright: widestring;LegalTrademarks: widestring;OriginalFileName: widestring;ProductName: widestring;Produc…

Django高级表单处理与验证实战

title: Django高级表单处理与验证实战 date: 2024/5/6 20:47:15 updated: 2024/5/6 20:47:15 categories: 后端开发 tags: Django表单验证逻辑模板渲染安全措施表单测试重定向管理最佳实践 引言&#xff1a; 在Web应用开发中&#xff0c;表单是用户与应用之间进行交互的重要…

OpenHarmony实战开发-请求自绘制内容绘制帧率

对于基于XComponent进行Native开发的业务&#xff0c;可以请求独立的绘制帧率进行内容开发&#xff0c;如游戏、自绘制UI框架对接等场景。 接口说明 开发步骤 说明&#xff1a; 本范例是通过Drawing在Native侧实现图形的绘制&#xff0c;并将其呈现在NativeWindow上 1.定义Ark…

《第一行代码》第二版学习笔记(7)——使用通知和摄像头

文章目录 一、使用通知二、调用摄像头 介绍了通知基于8.0的使用方法和如何调用摄像头拍照 一、使用通知 public void onClick(View v) {if (v.getId() R.id.send_notice){Intent intent new Intent(this,NotificationActivity.class);PendingIntent pi PendingIntent.getAct…

【哈希表】Leetcode 14. 最长公共前缀

题目讲解 14. 最长公共前缀 算法讲解 我们使用当前第一个字符串中的与后面的字符串作比较&#xff0c;如果第一个字符串中的字符没有出现在后面的字符串中&#xff0c;我们就直接返回&#xff1b;反之当容器中的所有字符串都遍历完成&#xff0c;说明所有的字符串都在该位置…

源码拾贝三则

目录 一 一种枚举类型的新型使用方式 二 Eigen库中的LDLT分解 三 Eigen中的访问者模式 一 一种枚举类型的新型使用方式 ///D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\xiosbase enum _Iostate { // consta…

springcloud第4季 springcloud-alibaba之分布式事务seata

一 seata介绍 1.1 seata介绍 1.seata是一款解决分布式事务的解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 2.seata的几种术语&#xff1a;一个中心&#xff1a;全局事务id TC(Transaction Coordinator):事务协调者。负责维护全局和分…

双非二本找工作前的准备day21

学习目标&#xff1a; 每天复习代码随想录上的题目1-2道算法&#xff08;时间充足可以继续&#xff09; 今日碎碎念&#xff1a; 1&#xff09;今天开始是二叉树系列 2&#xff09;出租屋里不知道干啥&#xff0c;看看书啊刷刷算法&#xff0c;打打游戏&#xff0c;学学技术…

通过iMock学习Jvmsandbox

Jvm-sandbox Jvm-sandbox基于Jvm-sandbox的Mock平台iMockiMock的工程学习iMock怎么写的&#xff08;sandbox的module应该怎么写&#xff09; Jvm-sandbox Jvm-sandbox是阿里开源的一款java的沙箱&#xff0c;看网上的介绍在沙箱里你可以做你能想到的奇妙的事情。 基于Jvm-san…

JavaScript百炼成仙自学笔记——16

HTML&#xff1a; 是什么&#xff1f;HyperText Markup Language 既超文本标记语言&#xff08;www的描述语言&#xff09; 既平常上网时所看到的网页 为什么&#xff1f;把存放在一台计算机中的文本或是图形与另一台计算机中的文本或图形方便的联系在一起&#xff0c;形成…

Python turtle库 实现 随机彩色文字平面批量输出

# -*- coding: utf-8 -*- """ Spyder Editor This is a temporary script file. """ import turtle import random import turtle as t t.colormode(255) turtle.bgcolor("white") h255 l50#字号 m60#间隔 n500 t.penup() turtle.hide…

redis进阶--IDEA环境

目录 一、解决redis服务器端口问题 二、java环境下使用redis 三、javaSpringt环境下使用redis 四、redis持久化 1、持久化概念 2、redis持久化策略 3、RDB策略 4、AOF策略 5、混合持久化策略 五、redis事务 1、数据库事务 2、redis事务特点 3、redis事务的作用 4…

在模方中已经选好水岸线了,但是点处理瓦块的时候还是提示水岸线没选

答&#xff1a;能部分位置不闭合&#xff0c;双击右键闭合一下&#xff0c;可以强行闭合缺口。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&#xff0c;支持…

[UDS][OTA] 自定义 IntelHEX (IHEX) format read/write library in C

参考修改 参考github的MIT协议开源项目 ihex 改写的代码 https://gitee.com/liudegui/intelhex-c 修改点&#xff1a; 修改Makefile脚本&#xff0c;支持x86_X64平台和aarch64平台将默认读取行长度设置为16位删除与ihex和bin之间的转换无关的示例代码 十六进制描述 HEX格式…

车牌检测识别功能实现(pyqt)

在本专题前面相关博客中已经讲述了 pyqt + yolo + lprnet 实现的车牌检测识别功能。带qt界面的。 本博文将结合前面训练好的模型来实现车牌的检测与识别。并用pyqt实现界面。最终通过检测车牌检测识别功能。 1)、通过pyqt5设计界面 ui文件如下: <?xml version="1…

TC3xx MTU概述(2)

目录 1.概述 2.如何配置NDT 3.小结 1.概述 上篇TC3xx MTU概述(1)-CSDN博客我们讲解了MTU基本功能和MBIST基本概念&#xff0c;接下来我们继续讲解MTU如何配置NDT算法。 2.如何配置NDT 前面聊了那么多概念&#xff0c;我们还是来看看如何配置MTU来实现NDT。 MTU寄存器分为…

pdf 文件版面分析--PyMuPDF (python 文档解析提取)

1.介绍 PyMuPDF 和Fitz 是用于Python中处理PDF文件的相关模块。Fitz是P有MuPDF的字模块。提供一个简化和封装版本的P有MuPDF功能。 关系&#xff1a; PyMuPDF&#xff1a; 提供广泛的功能&#xff0c;用于操作PDF文档&#xff0c; 包括方便的高级函数与底层操作Fitz &#x…

liunx服务器部署Llama2大模型

模型&#xff1a;Llama2-chat-13B-Chinese-50W 01 下载安装 Llama2 模型 Huggingface在国内是访问不了的&#xff0c;需要使用代理。在这里推荐使用 clash-for-liunx 配置代理。 安装 git-lfs&#xff0c;用于大文件下载 sudo apt-get install git-lfs git lfs installHuggi…