代码随想录刷题笔记 Day 51 | 单词拆分 No.139 | 多重背包理论基础

文章目录

    • Day 51
      • 01. 单词拆分(No. 139)
        • <1> 题目
        • <2> 笔记
        • <3> 代码
      • 02. 多重背包理论基础
        • 2.1 解题思路
        • 2.2 携带矿石资源(卡码网No.56)
          • <1> 题目
          • <2> 笔记
          • <3> 代码

Day 51

01. 单词拆分(No. 139)

题目链接

代码随想录题解

<1> 题目

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true

**注意:**不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

示例 1:

输入: s = “leetcode”, wordDict = [“leet”, “code”]
输出: true
解释: 返回 true 因为 “leetcode” 可以由 “leet” 和 “code” 拼接成。

示例 2:

输入: s = “applepenapple”, wordDict = [“apple”, “pen”]
输出: true
解释: 返回 true 因为 “applepenapple” 可以由 “apple” “pen” “apple” 拼接成。
注意,你可以重复使用字典中的单词。

示例 3:

输入: s = “catsandog”, wordDict = [“cats”, “dog”, “sand”, “and”, “cat”]
输出: false

<2> 笔记

给定一个字符串,问这个字符串能不能拆分成字典中的元素;反过来看就是字典中的字符串能不能填满这个字符串。而且字典中的字符是可以 无限次 使用的,这其实就类似一个 完全 背包问题;构建一个 01背包问题和构建一个完全背包问题的递推公式的最大区别其实就是,能不能在取得这个物品的状态的基础上再次取得物品

先来看题目中有什么状态,以及这个状态能否被转移:题目中问的是能否利用字典中的内容来构成这个字符串,对于一个字符串,划分其状态最好的方式其实就是其 长度,如果知道其中的 一段 是可以由字典中的内容来组成的,那这个状态能否可以转移呢?

如果这个遍历到的部分前面是可以拆分成字典中的内容,并且 这样一段中还是字典中的内容的话,那这一段加上前一段就是可以被拆分成字典中的内容了,这样状态就得到了转移。

那这样 dp 数组的含义也确定了,即从 index = 0index = i 能否拆分成字典中的单词。

再来考虑初始化,毫无疑问 dp[0] 是要初始化为 true 的,否则遍历是没有意义的。

首先来遍历字符串的长度

for (int i = 0; i < dp.length; i++) {}

再去确定 dp[i] 是否符合要求,这时候需要一个变量从头开始遍历,来检测某一段是否为 true

for (int j = 0; j < i && !dp[i]; j++) {if (dp[j]) {}
}

但这样是不够的,还需要从 ji 的这一段也是字典中的单词,即要添上另一个条件:

if (dp[j] && wordDict.contains(s.substring(j, i))) {dp[i] = true;
}

这样其实就写出了递推公式。

<3> 代码
class Solution {public boolean wordBreak(String s, List<String> wordDict) {boolean[] dp = new boolean[s.length() + 1];dp[0] = true;for (int i = 1; i < dp.length; i++) {for (int j = 0; j < i && !dp[i]; j++) {if (dp[j] && wordDict.contains(s.substring(j, i))) {dp[i] = true;}}}return dp[s.length()];}
}

02. 多重背包理论基础

2.1 解题思路

与01背包和完全背包不同的是,多重背包会规定每个物品 各有多少个,而不是简单的一个或者无数个。

但是解决多重背包问题的思路也很简单,我只需要将这每个物品 看成多个重量和价值都相同的物品即可,这样就可以通过处理01背包的思路来决解决这个问题了,但这种解法是最优的嘛?这里先按下不表,先来看一个例题。

2.2 携带矿石资源(卡码网No.56)
<1> 题目

题目链接

代码随想录题解

题目描述

你是一名宇航员,即将前往一个遥远的行星。在这个行星上,有许多不同类型的矿石资源,每种矿石都有不同的重要性和价值。你需要选择哪些矿石带回地球,但你的宇航舱有一定的容量限制。

给定一个宇航舱,最大容量为 C。现在有 N 种不同类型的矿石,每种矿石有一个重量 w[i],一个价值 v[i],以及最多 k[i] 个可用。不同类型的矿石在地球上的市场价值不同。你需要计算如何在不超过宇航舱容量的情况下,最大化你所能获取的总价值。

输入描述

输入共包括四行,第一行包含两个整数 C 和 N,分别表示宇航舱的容量和矿石的种类数量。
接下来的三行,每行包含 N 个正整数。具体如下:
第二行包含 N 个整数,表示 N 种矿石的重量。
第三行包含 N 个整数,表示 N 种矿石的价格。
第四行包含 N 个整数,表示 N 种矿石的可用数量上限。

输出描述

输出一个整数,代表获取的最大价值。

输入示例

10 3
1 3 4
15 20 30
2 3 2

输出示例

90

提示信息
数据范围:
1 <= C <= 10000;
1 <= N <= 10000;
1 <= w[i], v[i], k[i] <= 10000;

<2> 笔记

和上面说的一样,本题是一个多重背包问题,题目输入中可以形成三个数组,首先是和前面相同的 weightvalue 数组,还有每个物品的个数,number 数组。

首先想到的解题思路就是把所有重复的物品都当作单独的物品去处理,即第 i 个物品要遍历 number[i] 次,这才算遍历完了本次的物品,一共有 weight.length 个物品,每个物品有 number[i] 个,又要内层遍历背包,所以一共需要三层 for 循环,写出代码是这样的:

for (int i = 0; i < N; i++) { // 遍历矿石for (int j = 1; j <= number[i]; j++) { // 遍历矿石的数量for (int k = dp.length - 1; k >= weight[i]; k--) { // 遍历背包dp[k] = Math.max(dp[k], dp[k - weight[i]] + value[i]);}  }
}

但是提交之后会发现超时(大悲)

为什么会超时呢?试想一下,如果第一个物品有十个,那就遍历十次,没啥问题,那如果有一百个,一千个,一万个呢?那真的要遍历这么多次吗?

先来看一个例子,比如说容量为 5,有 1 种矿石,重量为 2,价值为 3,共有 10 个,即输入是:

5 1 2 3 10

查看输出的结果:

0 0 3 3 3 3 
0 0 3 3 6 6 
0 0 3 3 6 6 
0 0 3 3 6 6 
0 0 3 3 6 6 
0 0 3 3 6 6 
0 0 3 3 6 6 
0 0 3 3 6 6 
0 0 3 3 6 6 
0 0 3 3 6 6 

其实从第三行开始就没有什么区别了,这是为什么呢?物品价值为 2,第三行就是尝试将 3 个物品放入背包中,但是背包的总容量为 5,所以后面的遍历其实是没有意义的。

这样其实就知道,对于一个物品只需要遍历 k * weight[i] <= 背包容量 的部分就可以了,因为后面的部分和这些是完全一样的,基于这个思路再来改造一下代码。

for(int i = 0; i < N; i++) { // 遍历物品for(int j = dp.length - 1; j >= weight[i]; j--) { // 遍历背包容量for (int k = 1; k <= number[i] && (j - k * weight[i]) >= 0; k++) { dp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i]);}}
}

这次提交上去就不会报错了。

<3> 代码
import java.util.*;
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int C = sc.nextInt(); // 宇航舱的最大容量int N = sc.nextInt(); // 矿石的种类int[] weight = new int[N];int[] value = new int[N];int[] number = new int[N];int[] dp = new int[C + 1];int totalNum = 0; for (int i = 0; i < N; i++) weight[i] = sc.nextInt();for (int i = 0; i < N; i++) value[i] = sc.nextInt();for (int i = 0; i < N; i++) number[i] = sc.nextInt();for (int i = 0; i < N; i++) {for (int j = C; j >= weight[i]; j--) {for (int k = 1; k <= number[i] && (j - k * weight[i]) >= 0; k++) { // 遍历背包dp[j] = Math.max(dp[j], dp[j - k * weight[i]] + k * value[i]);}  }}System.out.println(dp[C]);}
}

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

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

相关文章

python-0002-linux安装pycharm

下载软件包 下载地址&#xff1a;https://download.csdn.net/download/qq_41833259/88944791 安装 # 解压 tar -zxvf 你的软件包 # 进入软件解压后的路径&#xff0c;如解压到了/home/soft/pycharm cd /home/soft/pycharm cd bin # 执行启动命令 sh pycharm.sh # 等待软件启…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的手写数字和符号识别(深度学习训练+UI界面+训练数据集)

摘要&#xff1a;开发手写数字和符号识别对于智能交互系统具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个手写数字和符号识别&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模…

STM32F103 CubeMX 定时器输出PWM控制呼吸灯

STM32F103 CubeMX 定时器输出PWM控制呼吸灯 1. 生成代码1. 1 配置外部时钟&#xff0c;SWD口1.2 配置定时器31.3 配置定时器2 2. 代码编写的部分 使用的cubmx 软件的版本&#xff1a;6.2.0 最新版本 6.10&#xff08;2024年3月11日&#xff09; 1. 生成代码 1. 1 配置外部时钟…

C++ 拷贝构造函数和运算符重载

目录 一. 拷贝构造函数 1. 引入 2. 拷贝构造的概念 3. 浅拷贝 4. 深拷贝 二. C运算符重载 1. 概念 2. 注意事项 3.举例 一. 拷贝构造函数 1. 引入 我们在创建对象时&#xff0c;能不能创建一个与原先对象一模一样的新对象呢&#xff1f;为了解决这个问题&#x…

关于PolarDB粗浅认识

PolarDB简介 目前&#xff08;20240314&#xff09;&#xff0c;PolarDB有两个版本&#xff1a; PolarDB-PG PolarDB PostgreSQL 版&#xff08;PolarDB for PostgreSQL&#xff0c;简称“PolarDB-PG”&#xff09;是阿里云自主研发的云原生关系型数据库产品&#xff0c;100%…

主板维修一般多少钱?电脑主板常见维修方法交换法

修主板一般要多少钱&#xff1f; 下面就让我们一起来了解一下吧。 电脑主板维修价格根据损坏程度不同而不同 1、电容器最容易损坏。 如果只是更换电容的话&#xff0c;大约需要50元左右。 2、如果主板上的电路损坏&#xff0c;面积越大&#xff0c;价格就越贵&#xff0c;可…

一学就会 | ChatGPT提示词-[简历指令库]-有爱AI实战教程(七)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、导读&#xff1a; 在使用 ChatGPT 时&#xff0c;当你给的指令越精确&#xff0c;它的回答会越到位&#xff0c;举例来说&#xff0c;假如你要请它帮忙写文案&#x…

测算土地面积并导出的新方法

让每一个人&#xff0c;都有自己的地图&#xff01; 我们在《如何测量显示多个距离和面积》一文中分享过测量距离和面积的方法&#xff0c;随着最近新版本的上线&#xff0c;该功能又有了新方法。 这里以测算土地面积并导出为例&#xff0c;分享这个新版本中的面积测量与导出…

某年某月第几天(模拟)

时间模板传送带-> 题目描述 定义一个结构体变量&#xff08;包括年、月、日&#xff09;。计算该日在本年中是第几天&#xff0c;注意闰年问题。 输入格式 年月日 输出格式 当年第几天 样例输入 2000 12 31 样例输出 366 #include <iostream> using namespace s…

黑天鹅大事件发生后,财产如何不受损失,fpmarkets一招教你

众所周知一旦行业内发生黑天鹅后&#xff0c;所带来的影响可以颠覆整个行业&#xff0c;再加上爆发的瞬间性对我们危害更大。那么黑天鹅大事件发生后&#xff0c;财产如何不受损失&#xff0c;今天fpmarkets一招教你。 塔勒布在《黑天鹅:极不可能事件的影响》一书中写道&#x…

一条 SQL 更新语句如何执行的

Server 层 存储引擎层 总流程 查询语句 连接器 查询缓存 分析器 优化器 执行器 更新语句 redo log&#xff08;节省的是随机写磁盘的 IO 消耗&#xff08;转成顺序写&#x…

骨传导耳机领头羊——南卡在AWE2024展会上展现强大的创新实力

在2024年的AWE&#xff08;中国家电及消费电子博览会&#xff09;上&#xff0c;南卡凭借其尖端的骨传导耳机技术再次成为业界瞩目的中心。作为骨传导技术的先驱和领航者&#xff0c;南卡不仅展出了其最新的产品&#xff0c;更向世界宣布了其在开放式耳机市场的宏伟蓝图。 南卡…

java零基础入门-Map集合练习(上)

一、教学目标 能够使用HashMap集合实现值为双列集合存放。能够使用HashMap集合实现值为单列集合存放。能够使用HashMap集合实现值为基本数据类型存放。能够使用HashMap集合实现值为对象存放。... 二、HashMap实现自定义元素存放 1、值存放基本数据类型 像这中就非常简单了呀…

损失函数和反向传播

1. 损失函数的基础 import torch from torch.nn import L1Loss from torch import nninputs torch.tensor([1, 2, 3], dtypetorch.float32) targets torch.tensor([1, 2, 5], dtypetorch.float32)inputs torch.reshape(inputs, (1, 1, 1, 3)) targets torch.reshape(targe…

迄今为止易用 —— 的 “盲水印“ 实现方案

前期回顾 网站的打赏 —— 新一代的思路-CSDN博客https://blog.csdn.net/m0_57904695/article/details/136704914?spm1001.2014.3001.5501 目录 CSDN 彩色之外 &#x1f4dd; 前言&#xff1a; &#x1f6e0;️ vue3-blind-watermark &#x1f916; 安装 ♻️ 引入&am…

Jmeter入参问题小记

表单入参的时候&#xff0c;这个地方需要勾选&#xff0c;如果不☑️选的话&#xff0c;会提示errorMsg":"Required String parameter code is not present",

【面试精讲】String是如何实现的?String源码分析

【面试精讲】String是如何实现的&#xff1f;String源码分析 目录 一、String实现机制 二、String不可变性&#xff08;使用final修饰&#xff09; 三、String 和 StringBuilder、StringBuffer 的区别 四、和equals的区别 五、String创建对象与JVM辨析 六、String源码解…

Spring Web MVC入门(1)

什么是Spring Web MVC? 定义:Spring Web MVC是基于Servlet构建的原始Web框架,从一开始就包含在Spring框架中.它的正式名称"Spring Web MVC"来自其源模块的名称(Spring-webmvc),但是它通常被称为"Spring MVC". 什么是Servlet? Servlet是一种实现动态页面…

springboot+ssm基于vue.js的客户关系Crm管理系统

系统包含两种角色&#xff1a;管理员、用户&#xff0c;主要功能如下。 ide工具&#xff1a;IDEA 或者eclipse 编程语言: java 数据库: mysql5.7 框架&#xff1a;ssmspringboot都有 前端&#xff1a;vue.jsElementUI 详细技术&#xff1a;springbootSSMvueMYSQLMAVEN 数据库…

电梯机房秀

每天乘坐电梯&#xff0c;您见过电梯的机房吗&#xff1f;来&#xff0c;跟着小伍去看看吧。Lets go&#xff01; 电梯还能节能呢&#xff0c;您知道么&#xff1f;正好&#xff0c;小伍一块带您看看电梯节能装置(●◡●) 目前电梯节能装置已广泛应用于三菱、富士、日立、奥的斯…