●139.单词拆分 ● 关于多重背包,你该了解这些! ●背包问题总结篇!

●139.单词拆分 

物品:wordDict里面的单词;背包容量:s.size()。

1.dp[j]含义。dp[j]=true表示字符串前j个可以拆分成字典中的单词。dp[s.size()] 就是最后的结果,整个字符串能(true)不能(false)拆分成字典中的单词。

2.递推公式。如leetcode,依次从l、le、lee、……、leetcode这8个字符串来检查是否能拆分成字典中的单词,最后返回 dp[s.size()] 这是外循环。然后对于每个字符串strj的检查,如果这个单词中有某个位置k为true(代表0到k这个位置可以拆分)且从k+1到这个单词的结束位置j的子串(strj字符串剩下的子串)在wordDict里面,就说明这个字符串strj从0到j都能拆分,所以dp[j]更新为true,检查这个位置k就得从字符串strj的开始到结尾了,取不取j都可以,这就是内循环

所以这样理解的话也确定了循环顺序,外循环是背包(j从1到s.size()),内循环也是也是背包(i从0到 j-1),就跟以前做的题不太一样。

3.初始化。dp[0]应该初始化为true,否则逐个判断后面的元素不会得到true的值,其他的一开始就应该是false,然后后面再挨个更新,看是否换成false。

4.遍历顺序。根据之前的推理两层循环都是背包,物品集合只是在循环里面做条件使用的。

5.打印。

代码如下。

j=0初始为true,其他的初始为false,

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

● 关于多重背包,你该了解这些! 

多重背包问题:有N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。

每件物品的最多Mi件可用,其实可以把Mi展开,就变成了01背包问题。

所以最直接的方法就是在重量数组和价值数组里面都把这些展开了的加入进去,物品0增加为2个……但是会超时。主要消耗在vector的动态底层扩容上。

 for (int i = 0; i < n; i++) {while (nums[i] > 1) { // 物品数量不是一的,都展开weight.push_back(weight[i]);value.push_back(value[i]);nums[i]--;}}

还有方法就是不改变这两个数组,我们知道纯01背包问题可以先物品,也可以先背包,然后考虑物品i放不放入两种情况,01背包放入就只会放入一个,所以就一个递推语句;但是多重背包可以放1个、……nums[i]个,所以每个物品i得有nums[i]个递推。so解决纯多重背包问题,要从纯01背包问题的递推代码:

dp[j]=max(dp[j-weight[i]]+value[i],dp[j]]

改为:

for(int k=1;k<=nums[i];++k){if(j>=k*weight[i]){dp[j]=max(dp[j-k*weight[i]]+k*value[i],dp[j]);}
}

即每个物品,都考虑不放和放k个多种情况。

代码如下:

#include<vector>
#include<iostream>
using namespace std;
void maxValue(){int begweight,N;cin >> begweight >> N;vector<int> dp(begweight+1,0);vector<int> nums(begweight+1);vector<int> weight(N);vector<int> value(N);for (int i = 0; i < N; i++) cin >> weight[i];for (int i = 0; i < N; i++) cin >> value[i];for (int i = 0; i < N; i++) cin >> nums[i];for(int i=0;i<N;++i){//先物品for(int j=begweight;j>=weight[i];--j){for(int k=1;k<=nums[i];++k){if(j>=k*weight[i])dp[j]=max(dp[j-k*weight[i]]+k*value[i],dp[j]);}}}cout<<dp[begweight];
}int main(){maxValue();return 0;
}

注意,在随想录中说:多重背包在面试中基本不会出现,力扣上也没有对应的题目,大家对多重背包的掌握程度知道它是一种01背包,并能在01背包的基础上写出对应代码就可以了。

●背包问题总结篇! 

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

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

相关文章

Docker 创建容器并指定时区

目录 1. 通过环境变量设置时区&#xff08;推荐&#xff09;2. 挂载宿主机的时区文件到容器中3. 总结 要在 Docker 容器中指定时区&#xff0c;可以通过两种方式来实现&#xff1a; 1. 通过环境变量设置时区&#xff08;推荐&#xff09; 在 Docker 运行时&#xff0c;可以通…

CentOS安装Docker(黑马学习笔记)

Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频道。 官方网站上…

文件底层的理解之缓冲区

目录 一、缓冲区的初步认识 二、向文件中写数据的具体过程 三、缓冲区刷新的时机 一、缓冲区的初步认识 缓冲区其实就是一块内存区域&#xff0c;采用空间来换时间&#xff0c;可以提高使用者的效率。我们一直说的缓冲区其实是语言层面上的缓冲区&#xff0c;其实操作系统内部…

JVM 第一部分 JVM两种解释器 类加载过程和类加载器

JVM是跨平台跨语言的虚拟机&#xff0c;不直接接触硬件&#xff0c;位于操作系统的上一层 跟字节码文件直接关联&#xff0c;和语言没有关系 一次编译成字节码文件&#xff0c;多次执行 虚拟机可以分成三部分&#xff1a;类加载器&#xff0c;运行时数据区&#xff0c;执行引…

TDengine 在 DISTRIBUTECH 分享输配电数据管理实践

2 月 27-29 日&#xff0c;2024 美国国际输配电电网及公共事业展&#xff08;DISTRIBUTECH International 2024&#xff09;在美国-佛罗里达州-奥兰多国家会展中心举办。作为全球领先的年度输配电行业盛会&#xff0c;也是美洲地区首屈一指的专业展览会&#xff0c;该展会的举办…

【和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告

【&#x1f40b;和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告 文章目录 【&#x1f40b;和鲸冬令营】通过数据打造爆款社交APP用户行为分析报告1 业务背景2 数据说明3 数据探索性分析4 用户行为分析4.1 用户属性与行为关系分析4.2 转化行为在不同用户属性群体中的分布…

值类型和引用类型详解(C#)

可能你对值类型和引用类型还不太了解。 值类型和引用类型&#xff0c;是c#比较基础&#xff0c;也必须掌握的知识点&#xff0c;但是也不是那么轻易就能掌握&#xff0c;今天跟着我一起来看看吧。 典型类型 首先我们看看这两种不同的类型有哪些比较典型的代表。 典型值类型…

在Windows 10系统中启用快速启动功能

在Windows 10系统中启用快速启动功能&#xff0c;可以按照以下步骤进行&#xff1a; 方法一&#xff08;通过设置应用&#xff09;&#xff1a; 点击任务栏左下角的“开始”按钮或者按键盘上的Win键打开“开始”菜单。在“开始”菜单中选择“设置”图标&#xff08;齿轮形状&…

3.3日学习打卡----初学Redis(一)

3.3日学习打卡 目录&#xff1a; 3.3日学习打卡NoSQL为什么要用NoSQL什么是NoSQL?NoSQL的四大分类关系型数据库和非关系型数据及其区别NoSQL经典应用 RedisRedis是什么?Linux下安装RedisDocker下安装Redis基本知识 NoSQL 为什么要用NoSQL 单机Mysql的美好年代 在90年代&…

Sqlmap进行http头注入及流量分析

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 利用 SQLMap 进行 HTTP 头注入的方式对于 Less-19 注入点的注入 SQLMap 工具我使用kali中自带的 注入准备 先使用bp将Less-19靶场的包抓下来保存到 txt 文件中,输入账号 admin…

Ubuntu23.10禁用Wayland

禁用前 编辑custom.conf文件 sudo vim /etc/gdm3/custom.conf 去掉WaylandEnablefalse前的#号 保存退出 重启系统 生效: 成功转换为X11

【LeetCode题解】2809. 使数组和小于等于 x 的最少时间+2788. 按分隔符拆分字符串+410. 分割数组的最大值

文章目录 [2809. 使数组和小于等于 x 的最少时间](https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/)思路&#xff1a; [2788. 按分隔符拆分字符串](https://leetcode.cn/problems/split-strings-by-separator/)思路&#xff1a; [410. 分割数组的最大…

Leetcoder Day36| 动态规划part03

343. 整数拆分 给定一个正整数 n&#xff0c;将其拆分为至少两个正整数的和&#xff0c;并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2输出: 1解释: 2 1 1, 1 1 1。 示例 2: 输入: 10输出: 36解释: 10 3 3 4, 3 3 4 36。说明: 你可以假设 …

如何提取图片中某个位置颜色的RGB值,RGB十进制值与十六进制的转换

打开本地的画图工具&#xff0c;把图片复制或截图粘进去&#xff0c;用颜色提取器点对应的位置就可以提取了。 获取到的 RGB 值为 (66,133,244) 转化后的值为 #4285F4。 【内容拓展一】&#xff1a;RGB 十进制值与十六进制的转换 当我们从 RGB 十进制值转换为十六进制值时&a…

Yapi部署

【GO开发工程师】Yapi部署 推荐个人主页&#xff1a;席万里的个人空间 文章目录 【GO开发工程师】Yapi部署1、Yapi部署 1、Yapi部署 初始化yapi&#xff1a; git clone https://github.com/Ryan-Miao/docker-yapi.git cd docker-yapi docker-compose upyapi启动失败 1.cd进入…

粉丝福利-纯净Windows系统安装镜像下载网站

​Windows操作系统镜像文件是从微软或其他经过验证的来源下载正版操作系统安装介质的关键所在。以下是详细阐述从不同渠道获取Windows系统镜像的说明,尤其强调官方和安全的下载途径。Windows系统镜像可以从多个可靠来源下载,以下是几个推荐的选择: 微软官方网站 微软官方网…

对于《幻兽帕鲁》这样的游戏,如何优化服务器性能以提高游戏体验?

对于《幻兽帕鲁》这样的游戏&#xff0c;如何评估和优化服务器性能以提高游戏体验&#xff1f; 硬件配置优化&#xff1a;选择高性能的服务器&#xff0c;如4核16G的幻兽帕鲁服务器&#xff0c;这样可以保证有足够的计算性能和内存容量来支持游戏的运行。同时&#xff0c;考虑到…

Node.js(六)-数据库与身份认证

一 、学习目标 ◆ 能够知道如何配置MySQL数据库环境 ◆ 能够认识并使用常见的 SQL语操作数据库 ◆ 能够在Express中操作MySQL数据库 ◆ 能够了解 Session的实现原理 ◆ 能够了解JWT的实现原理 二、数据库的基本概念 1.1 什么是数据库 数据库&#xff08;database&#xff09;…

边缘计算网关的重要作用-天拓四方

随着物联网技术的迅猛发展&#xff0c;数据量的爆炸式增长对数据处理和分析提出了更高的要求。边缘计算网关作为连接物理世界和数字世界的桥梁&#xff0c;正逐渐受到各行业的重视。本文将从行业背景、功能特点以及带来的效益等方面&#xff0c;探讨边缘计算网关在当前及未来的…

备战蓝桥杯---状态压缩DP基础2之TSP问题

先来一个题衔接一下&#xff1a; 与上一题的思路差不多&#xff0c;不过这里有几点需要注意&#xff1a; 1.因为某一列的状态还与上上一行有关&#xff0c;因此我们令f[i][j][k]表示第i行状态为j,第i-1行状态为k的最大炮兵数。 因此&#xff0c;我们可以得到状态转移方程&…