代码随想录第46天|139.单词拆分,了解多重背包,背包总结

139.单词拆分

动规五部曲

1.确定valid数组以及下标的含义

valid[i] : 字符串长度为i的话,valid[i]为true,表示可以拆分为一个或多个在字典中出现的单词

2.valid初始化

valid[0]一定要为true,否则递推下去后面都都是false了

3.递推公式

所以递推公式是 if([j, i] 这个区间的子串出现在字典里 && valid[j]是true) 那么 valid[i] = true。

4.遍历顺序

关于求组合还是排列还是最小数做一个总结:

求组合数:动态规划:518.零钱兑换II (opens new window)

求排列数:动态规划:377. 组合总和 Ⅳ (opens new window),动态规划:70. 爬楼梯进阶版(完全背包) (opens new window)

求最小数:动态规划:322. 零钱兑换 (opens new window)、动态规划:279.完全平方数

而本题其实我们求的是排列数,为什么呢。 拿 s = "applepenapple", wordDict = ["apple", "pen"] 举例。

"apple", "pen" 是物品,那么我们要求 物品的组合一定是 "apple" + "pen" + "apple" 才能组成 "applepenapple"。

"apple" + "apple" + "pen" 或者 "pen" + "apple" + "apple" 是不可以的,那么我们就是强调物品之间顺序。

所以说,本题一定是 先遍历 背包,再遍历物品。

5.推导

代码实现

class Solution {public boolean wordBreak(String s, List<String> wordDict) {//完全背包//valid[i]表示字符串下标为i时,可以被字符串列表中的字符拼接出来HashSet<String> set=new HashSet<>(wordDict);//,将字典 wordDict 转化为一个 HashSet 集合 setboolean[] valid=new boolean[s.length()+1];//valid[i] 表示从字符串 s 的第 0 个字符到第 i 个字符(不包括第 i 个字符)所组成的子串是否可以被字典中的单词拆分。valid[0]=true;for(int i=1;i<=s.length();i++){for(int j=0;j<i&&!valid[i];j++){if(set.contains(s.substring(j,i))&&valid[j]){//i表示截取的结束位置,j表示截取的起始位置//对于每个子串,检查它是否存在字典中valid[i]=true;//表示从0到i的子串可以被拆分}}}return valid[s.length()];//表示整个字符串s是否可以被拆分成字典中的单词}
}

多重背包

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

其实多重背包和01背包很想,01背包每个物品只有1个,多重背包只是每个物品有多个

ublic void testMultiPack1(){// 版本一:改变物品数量为01背包格式List<Integer> weight = new ArrayList<>(Arrays.asList(1, 3, 4));List<Integer> value = new ArrayList<>(Arrays.asList(15, 20, 30));List<Integer> nums = new ArrayList<>(Arrays.asList(2, 3, 2));int bagWeight = 10;for (int i = 0; i < nums.size(); i++) {while (nums.get(i) > 1) { // 把物品展开为iweight.add(weight.get(i));value.add(value.get(i));nums.set(i, nums.get(i) - 1);}}int[] dp = new int[bagWeight + 1];for(int i = 0; i < weight.size(); i++) { // 遍历物品for(int j = bagWeight; j >= weight.get(i); j--) { // 遍历背包容量dp[j] = Math.max(dp[j], dp[j - weight.get(i)] + value.get(i));}System.out.println(Arrays.toString(dp));}
}

背包问题总结

核心五步

  1. 确定dp数组(dp table)以及下标的含义
  2. 确定递推公式
  3. dp数组如何初始化
  4. 确定遍历顺序
  5. 举例推导dp数组

01背包

01背包的一维和二维两种实现方式的差异体现在:

一维:倒序遍历(如果正序遍历背包的话一个物品会被放置多次),且必须先遍历物品再遍历背包(防止每个背包只放入一个物品)

二维:正序遍历,先遍历背包还是先遍历物品都可以

416. 分割等和子集:

01背包问题,先遍历物品再倒序遍历背包,要判断给定的数组能不能被分割成和相等的两组,首先对整个数组求和sum,然后得到target=sum/2,确定dp[i]表示容量为i背包的最大价值,确定递推公式为dp[j]=Math.max(dp[j],dp[j-nums[i]]+nums[i]);

1049. 最后一块石头的重量 II 

01背包问题,跟416 分割等和子集很像,先遍历物品再倒序遍历背包

494.目标和

01背包问题,先遍历物品再倒序遍历背包,首先公式推导得出left=(sum+target)/2,问题转换成在集合nums中找出和为left的组合。求装满背包有几种方法的情况下,递推公式一般为:dp[j]+=dp[j-nums[i]];

474.一和零

找出并返回 strs 的最大子集的长度,找出的该子集中最多有m个0和n个1,dp[i][j]表示i个0和j个1时的最大子集大小,首先要遍历字符串数组的每个字符串,统计每个字符串的0的个数和1的个数,然后倒序遍历zeroNum和倒序遍历oneNum

完全背包

完全背包相较于01背包就是物品可以取无限次

377. 组合总和 Ⅳ

这道题是排列问题不是组合,dp[i]: 凑成目标正整数为i的排列个数为dp[i],遍历顺序:target(背包)放在外循环,将nums(物品)放在内循环,内循环从前到后遍历,在遍历过程中需要判断容量j是否大于等于nums[i],只有满足这个条件才可以执行递推公式

518.零钱兑换II

求的是组合数,dp[i]表示凑成总金额为i的货币组合数,要判断coins[i]与我们当前遍历的背包的容量j的大小关系,现遍历背包还是先遍历物品都可以

有一个结论:求组合数先遍历物品再遍历背包;求排列数先遍历背包再遍历物品

70. 爬楼梯

之前没学背包问题前用普通动规分析就可以做,现在用完全背包的思路,dp[i]表示到达第i阶的方法数,要判断i与我们当前遍历的背包的容量j的大小关系,dp[j]+=dp[j-i];

322. 零钱兑换

dp[j]:凑足金额为j所需钱币的最少个数,这里也是求的组合问题。下标为0初始化为0,非0下标初始化为最大值,需要进行判断防止int类型溢出:

  if (dp[j - coins[i]] != Integer.MAX_VALUE) {

             //如果是dp[j - coins[i]等于Integer.MAX_VALUE,那么+1后溢出,变成-2147483648
                    dp[j]=Math.min(dp[j],dp[j-coins[i]]+1);

}

先遍历背包还是物品无所谓,求的是组合数的最小数,所以不影响,如果要求我们把所有组合情况列出来,那么我们就需要回溯法了

279.完全平方数

这道题和322. 零钱兑换思路基本一致,也是求组合数的最小数,dp[i]表示组成和为i的最少完全平方数个数,递推公式:dp[j]=Math.min(dp[j],dp[j-i*i]+1);先遍历背包还是物品无所谓

多重背包 

了解即可,因为多重背包问题可以被拆成01背包看

 

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

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

相关文章

《低代码指南》——低代码+AI,智能化的构建数字应用

LCHub低代码社区:对低代码平台在AI领域的应用及其成果进行了深入阐述。他强调,在AI时代,工程化的重要性不容忽视,同时,复杂系统建设和数据模型驱动开发也占据了核心地位。 顾伟不仅深入探讨了低代码零代码平台在业界的不同分类和使用场景,还详细解读了低代码平台的功能架…

C++ STL教程

C 标准模板库的核心包括&#xff1a;&#xff08;1&#xff09;容器&#xff08;Containers&#xff09;&#xff1b;&#xff08;2&#xff09;算法&#xff08;Algorithms&#xff09;&#xff1b;&#xff08;3&#xff09;迭代器&#xff08;iterators&#xff09; &#…

百望云蝉联2023「Cloud 100 China 」榜单 综合实力再获认可

9月7日&#xff0c;2023 Cloud 100 China 榜单于上海中心正式发布&#xff0c;榜单由靖亚资本与崔牛会联合推出&#xff0c;百望云凭借着过硬的综合实力与卓越的技术创新能力&#xff0c;再次荣登榜单&#xff0c;位居第六位。 本届评选&#xff0c;Top 100 企业的数据指标的权…

拦截器学习

什么是拦截器 Spring MVC 中的拦截器( Interceptor )类似于ServLet中的过滤器( Filter )&#xff0c;它主要用于拦截用户请求并作出相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。 工作原理 一个拦截器&#xff0c;只有 preHandle …

【SpringCloud微服务--Eureka服务注册中心】

SpringCloud微服务全家桶学习笔记【持续更新】 gitee仓库 内容&#xff1a;SpringCloud SpringCloud alibaba 技术栈&#xff1a;Java8mavengit&#xff0c;githubNginxRabbitMQSpringBoot2.0 微服务架构概述 微服务架构是一种架构模式&#xff0c;它提倡将单一应用程序划…

局域网内部如何实现文件夹共享

这里写自定义目录标题 1.创建文件夹test2.选择共享--添加用户3.选择高级共享 1.创建文件夹test 2.选择共享–添加用户 3.选择高级共享

three.js 纹理

默认情况下&#xff0c;您在 Three.js 中渲染的所有内容都会发送到屏幕上。毕竟&#xff0c;如果你看不到它&#xff0c;渲染它有什么意义呢&#xff1f;事实证明&#xff0c;有一个非常重要的点&#xff1a;在数据发送到屏幕&#xff08;从而丢失&#xff09;之前捕获数据。 …

容器编排学习(九)服务管理与用户权限管理

一 service管理 1 概述 容器化带来的问题 自动调度&#xff1a;在 Pod 创建之前&#xff0c;用户无法预知 Pod 所在的节点&#xff0c;以及 Pod的IP 地址一个已经存在的 Pod 在运行过程中&#xff0c;如果出现故障&#xff0c;Pod也会在新的节点使用新的IP 进行部署应用程…

Java“牵手”微店商品详情数据,微店商品详情API接口,微店API接口申请指南

微店平台商品详情接口是开放平台提供的一种API接口&#xff0c;通过调用API接口&#xff0c;开发者可以获取微店商品的标题、价格、库存、月销量、总销量、库存、详情描述、图片等详细信息 。 获取商品详情接口API是一种用于获取电商平台上商品详情数据的接口&#xff0c;通过…

举例说明PyTorch函数torch.cat与torch.stack的区别

一、torch.cat与torch.stack的区别 torch.cat用于在给定的维度上连接多个张量&#xff0c;它将这些张量沿着指定维度堆叠在一起。 torch.stack用于在新的维度上堆叠多个张量&#xff0c;它会创建一个新的维度&#xff0c;并将这些张量沿着这个新维度堆叠在一起。 二、torch.…

03JVM_类加载

一、类加载与字节码技术 1.类文件结构 2.字节码指令 3.编译期处理 4.类加载阶段 5.类加载器 6.运行期优化 1.类文件结构 类文件结构 1.1 魔数magic 介绍 每个java class文件的前4个字节是魔数&#xff1a;0x CAFEBABE。魔数作用在于分辨出java class文件和非java clas…

Vuepress样式修改内容宽度

1、相关文件 一般所在目录node_modules\vuepress\theme-default\styles\wrapper.styl 2、调整宽度&#xff0c;截图中是已经调整好的&#xff0c;在我电脑上显示刚刚好。

026:vue中el-progress逆向倒计时方式显示

第026个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Kubernetes dashboardv2.7.0安装指南:从零开始搭建可视化界面

一、K8S管理控制台 Kubernetes Web UI&#xff08;或Kubernetes Dashboard&#xff09;是用于管理和监视Kubernetes集群的不同工具和用户界面。以下是一些常见的Kubernetes Web UI工具和用户界面&#xff1a; Kubernetes Dashboard: Kubernetes官方提供的Web用户界面&#xf…

MYSQL的慢查询

通过查询SQL的执行频次&#xff0c;我们就能够知道当前数据库到底是增删改为主&#xff0c;还是查询为主。 那假如说是以查询为主&#xff0c;次数我们可以借助于慢查询日志。接下来&#xff0c;我们就来介绍一下MySQL中的慢查询日志。 慢查询日志 慢查询日志记录了所有执行时间…

VirtualBox(内有Centos 7 示例安装)

1常见概念以及软件安装 1.1 虚拟化技术&#xff1a; 虚拟化技术指的是将计算机的各种硬件资源加以抽象、转换、分割&#xff0c;最后组合 起来的技术。其目的和作用主要是打破硬件资源不可分的情况&#xff0c;方便程序员自 己集成所需资源。 1.2 Virtual Box 其是虚拟化技术作…

图解三重积分的对称性

1.图解三重积分的对称性 关于三重积分详见&#xff1a;三重积分(Triple Integral) 三重积分的对称性原理与二重积分类似&#xff0c;关于二重积分的对称性详见&#xff1a;图解二重积分的对称性 被积函数 f ( x , y , z ) f(x,y,z) f(x,y,z)可以有不同的物理意义&#xff0c;…

SSMP整合综合案例【SpringBoot的基本增删改查】

一、基本页面 主页面 添加 删除 分页 条件查询 实体类开发————使用Lombok快速制作实体类 Dao开发————整合MyBatisPlus&#xff0c;制作数据层测试 Service开发————基于MyBatisPlus进行增量开发&#xff0c;制作业务层测试类 Controller开发————基于Restful…

【Two Stream network (Tsn)】(二) 阅读笔记

贡献 将深度神经网络应用于视频动作识别的难点&#xff0c;是如何同时利用好静止图像上的 appearance information以及物体之间的运动信息motion information。本文主要有三点贡献&#xff1a; 1.提出了一种融合时间流和空间流的双流网络&#xff1b; 2.证明了直接在光流上训…

【Spring面试】五、Bean扩展、JavaConfig、@Import

文章目录 Q1、如何在Spring创建完所有的Bean之后做扩展&#xff1f;Q2、Spring容器启动时&#xff0c;为什么先加载BeanFactoryPostProcess?Q3、Bean的生产顺序是由什么决定的&#xff1f;Q4、Spring有哪几种配置方式Q5、JavaConfig是如何替代spring.xml的&#xff1f;Q6、Com…