代码随想录算法训练营第四十九天 | 139.单词拆分、多重背包、背包问题总结

139.单词拆分

视频讲解: 动态规划之完全背包,你的背包如何装满?| LeetCode:139.单词拆分_哔哩哔哩_bilibili

代码随想录

解题思路

1.dp[i]  字符串的长度为i,dp[i]是否可以被组成

2.递推公式

 if( [j,i] && dp[j] =true)   这个ji区间在字典中,并且dp[j] = true

3.初始化

dp[0] = true   在题目中没有定义,但是为了推导,初始为true

非零下标为false

4.遍历循序

装满这个背包,对物品的顺序是有要求的,因此这题是排列

for( i<=s.size() )

  for(j=0 ; j<i ;j ++)

    string word = s.substr(j,i-j);  进行截取

class Solution {
public:bool wordBreak(string s, vector<string>& wordDict) {unordered_set<string> wordSet(wordDict.begin(),wordDict.end());vector<bool> dp(s.size()+1,false);dp[0] = true;for(int j=1 ; j<=s.size();j++){for(int i = 0 ; i < j ; i++){string word = s.substr(i,j-i);if(wordSet.find(word) != wordSet.end() && dp[i]==true)dp[j] = true;}}return dp[s.size()];}
};

多重背包

和01背包是很相似的

但是这样拆分为01背包很容易超时,因为vector的动态扩容,因此我们只需要再加一层循环,遍历物品个数即可

 背包问题总结

代码随想录

01背包:2维dp为什么可以转换为1维dp? 

1维dp利用的是滚动数组,由于我们2维dp中,dp[i][j]的值都是由上方或者左上方的某一个值推来的,因此只需要两行数据,然后我们可以将上一行数据拷贝存在一行数据中,动态更新即可

01背包:为什么遍历顺序必须是先物品再背包,为什么遍历背包时,需要倒序遍历?

首先,为什么要倒序遍历?因此由二维dp压缩为一维dp可知,一维dp的值是上一行的数值,因此如果我们从左边正序更新,那么就会丢失上一行数据,无法推出这一行的数据。但我们如果从右边倒序遍历,那么左边的值还未更新,因此是上一行数据,可以推出这一行数据

其次,为什么顺序必须物品,再背包?因为只有这样,物品只会被选取1次(更新完数据了,新数据是由旧数据推来的,因此视为1次),如果反一下,先背包再物品,那么就会变成装满这个容量的背包,有哪些物品 

完全背包: 遍历顺序和for循环内部与01背包的不同

与01背包的不同:我们遍历背包时是正序遍历,从weight[i]开始,因为完全背包物品可以使用无数次,每次都是由新数据(一维dp左边的数据推得而来,视为可以使用无数次)推的而来,因此是正序

如果是纯完全背包问题(求最大价值),遍历顺序是可以颠倒的,因为不管是先行还是先列推导,都可以得到左边的数据

但如果题目求得是组合问题,那么就必须先物品再容量:例如先遍历物品1,再遍历物品2,只会出现[1,2]的情况

如果求得是排列问题,那么就必须先容量再物品,因为假如weight[2]>weight[1],那么在容量为3的情况下,就可能出现[2,1]和[1,2]两种不同的组合,因此是排列

背包添加额外限制条件

因为我们平时都是一维dp[j],只有容量一个限制,如果当我们有别的限制,例如有两个维度的容量,或者对选取物品种类个数有要求,那么就dp[j][k],利用二维dp,多加限制 

收获

背包问题结束,继续加油 

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

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

相关文章

硬件IIC和软件IIC的比较

&#xff08;一&#xff09;硬件IIC 硬件IIC是由STM32内部的硬件模块实现的&#xff0c;使用CPU的时钟信号来控制数据传输和时序&#xff0c;通信速度较快&#xff0c;可以达到几十MHz的速度。硬件IIC的实现相对简单&#xff0c;无需编写复杂的代码&#xff0c;因此在实现IIC通…

如何理解与学习数学分析——第二部分——数学分析中的基本概念——第5章——序列

第2 部分&#xff1a;数学分析中的基本概念 (Concepts in Analysis) 5. 序列(Sequences) 本章介绍了序列属性&#xff0c;例如单调性、有界性和收敛性&#xff0c;使用图表和示例来解释这些属性&#xff0c;并演示如何在各种证明中使用它们的定义。讨论了趋于无穷大的序列出…

API key学习笔记

API Key 基本上可以认为是一个长字符串&#xff0c;允许 API 消费者&#xff08;即使用 API 的人&#xff09;访问受限的功能和数据。它作为一种安全措施&#xff0c;确保了 API 服务能够控制谁有权限访问什么数据&#xff0c;同时也帮助跟踪API的使用情况。生成API key来调用A…

centos官方yum源不可用 解决方案(随手记)

昨天用yum安装软件的时候&#xff0c;就报错了 [rootop01 ~]# yum install -y net-tools CentOS Stream 8 - AppStream 73 B/s | 38 B 00:00 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlis…

创新指南 | 5个行之有效的初创企业增长策略

本文探讨了五种初创企业实现快速增长的有效策略&#xff1a;利用网络效应通过激励和资本化用户增长&#xff1b;通过持续提供高质量内容建立信任和权威的内容营销&#xff1b;利用简单有效的推荐计划扩展用户群&#xff1b;采用敏捷开发方法快速适应市场变化和客户反馈&#xf…

Codeforces Round 950 (Div. 3) A B C D E

A. Problem Generator time limit per test: 1 second memory limit per test: 256 megabytes input: standard input output: standard output Vlad is planning to hold m m m rounds next month. Each round should contain one problem of difficulty levels ‘A’, ‘B’…

Java:JDK8 GC中ParNew和CMS的问题说明

JDK8中常用如下的垃圾收集器&#xff0c;它们分别运用在年轻代和老年代&#xff1a; ParNew : 年轻代垃圾收集器&#xff0c;多线程&#xff0c;采用标记—复制算法。 CMS&#xff1a;老年代的收集器&#xff0c;全称&#xff08;Concurrent Mark and Sweep&#xff09;&#…

[消息队列 Kafka] Kafka 架构组件及其特性(二)Producer原理

这边整理下Kafka三大主要组件Producer原理。 目录 一、Producer发送消息源码流程 二、ACK应答机制和ISR机制 1&#xff09;ACK应答机制 2&#xff09;ISR机制 三、消息的幂等性 四、Kafka生产者事务 一、Producer发送消息源码流程 Producer发送消息流程如上图。主要是用…

国自然基金的检索

&#xff08;1&#xff09;网址 跳转国自然基金网址&#xff1a;https://www.nsfc.gov.cn/ &#xff08;2&#xff09;查询入口 &#xff08;3&#xff09;进行查询

【LeetCode 滑动窗口】LC_3_无重复字符的最长子串

文章目录 1. 无重复字符的最长子串 1. 无重复字符的最长子串 题目链接&#x1f517; &#x1f34e;题目思路&#xff1a;&#x1f427;① 滑动窗口的思想&#xff1b;&#x1f427;② 用什么来维护窗口呢 &#xff1f; 用 双指针 和 unordered_set来维护&#xff0c;为什么呢…

标题:深入探索Linux中的`ausyscall`

标题&#xff1a;深入探索Linux中的ausyscall&#xff08;注意&#xff1a;ausyscall并非Linux内核标准命令&#xff0c;但我们可以探讨类似的概念&#xff09; 在Linux系统中&#xff0c;系统调用&#xff08;syscall&#xff09;是用户空间程序与内核空间进行交互的一种重要…

Git介绍及应用

1.简介 Git是一个分布式版本控制器&#xff0c;通常用来对软件开发过程中的源代码文件进行管理。通过Git仓库来存储和管理这些文件&#xff0c;Git仓库分为两种&#xff1a; 本地仓库:开发人员自己电脑上的Git仓库远程仓库:远程服务器上的Git仓库 2.执行流程 3.Git代码托管服务…

【TB作品】MSP430F5529 单片机,温度控制系统,DS18B20,使用MSP430实现的智能温度控制系统

作品功能 这个智能温度控制系统基于MSP430单片机设计&#xff0c;能够实时监测环境温度并根据预设的温度报警值自动调节风扇和加热片的工作状态。主要功能包括&#xff1a; 实时显示当前温度。通过OLED屏幕显示温度报警值。通过按键设置温度报警值。实际温度超过报警值时&…

【经验分享】嵌入式入坑经历(选段)

文章目录 你现在的工作中所用到的专业知识有哪些呢&#xff1f;为什么想转行了&#xff1f;后来为什么从事了嵌入式行业呢?你对嵌入式的兴趣是何时培养起来的?你是怎么平衡兴趣爱好和工作的关系的?平时做的事情对你现在的工作有哪些帮助?对于有志学习嵌入式开发的在校大学生…

【96】write combine机制介绍

前言 这篇文章主要介绍了write combine的机制 一、write combine的试验 1.系统配置 &#xff08;1&#xff09;、CPU&#xff1a;11th Gen Intel(R) Core(TM) i7-11700 2.50GHz &#xff08;2&#xff09;、GPU&#xff1a;XX &#xff08;3&#xff09;、link status&am…

MySQL(四) - SQL优化

一、SQL执行流程 MySQL是客户端-服务器的模式。一条SQL的执行流程如下&#xff1a; 在执行过程中&#xff0c;主要有三类角色&#xff1a;客户端、服务器、存储引擎。 大致可以分为三层&#xff1a; 第一层&#xff1a;客户端连接到服务器&#xff0c;构造SQL并发送给服务器…

Python | 排队取奶茶

队列的基本概念&#xff08;队头、队尾&#xff09;和特点&#xff08;先入先出&#xff09; 在 Python 语言中&#xff0c;标准库中的queue模块提供了多种队列的实现&#xff0c;比如普通队列和优先级队列&#xff0c;因此你可以使用queue.Queue类来创建队列&#xff0c;不过…

惠海 H5528 升降压芯片 12V24V36V48V60V75V LED恒流驱动IC 调光细腻顺滑无阶梯感

惠海H5528是一款升压、降压、升压降压的LED恒流驱动IC&#xff0c;其具备宽范围调光比且无频闪调光的特性&#xff0c;使得它在智能照明、Dali调光、0~10V调光、摄影灯照明以及补光灯照明等多种应用中具有广泛的应用前景。 这款芯片支持降压、升压和升降压拓扑的应用&#xff0…

C++面向对象程序设计 - 文件操作与文件流

在实际应用中&#xff0c;常以磁盘文件作为对象&#xff0c;即能从磁盘文件读取数据&#xff0c;也能将数据输出到磁盘文件&#xff0c;磁盘是计算机的外部存储器&#xff0c;能够长期保留信息&#xff0c;能读能写&#xff0c;可以刷新重写等等。 在C中&#xff0c;文件操作通…

Flink Rest Basic Auth - 安全认证

背景 公司目前需要将Flink实时作业云化,构建多租户实时计算平台。目前考虑为了资源高效利用,并不打算为每个租户部署一套独立的Kubernetes集群。也就意味着多个租户的作业可能会运行在同一套kubernets集群中。此时实时作业的任务就变的很危险,因为网络可能是通的,就会存在…