代码随想录算法训练营第四十六天 139.单词拆分、多重背包(了解)、 背包总结

代码随想录算法训练营第四十六天 | 139.单词拆分、多重背包(了解)、 背包总结

139.单词拆分

题目链接:139. 单词拆分 - 力扣(LeetCode)

class Solution {public boolean wordBreak(String s, List<String> wordDict) {// 字典中的单词就是物品,字符串s就是背包,物品能不能把背包装满?Set<String> wordDictSet = new HashSet(wordDict);boolean[] dp = new boolean[s.length() + 1];// dp[i]表示字符串 s 前 i个字符组成的字符串 s[0..i−1]是否能被空格拆分成若干个字典中出现的单词// 递推公式 //  if( [j, i] 这个区间的子串出现在字典里 && dp[j]是true) 那么 dp[i] = true。dp[0] = true; // dp[0]就是递推的根基,dp[0]一定要为true, dp[0]没有意义// 先遍历背包/**如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。 ✔*/for(int i = 1; i <= s.length(); ++i) {// 然后,我们开始遍历字符串 "leetcode" 的每个字符,同时对于每个字符,我们都会从字符头部遍历到当前字符的每个子字符串。for(int j = 0; j < i; ++j) {if(dp[j] && wordDictSet.contains(s.substring(j, i))) {// 判断s[0, j-1]是否存在于字典中,以及s[j, i-1]是否存在于字典中dp[i] = true;break;}}}return dp[s.length()];}
}

多重背包(了解)

题目链接:代码随想录 (programmercarl.com)

背包总结

题目链接:代码随想录 (programmercarl.com)

416.分割等和子集1

dp五部曲:

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

背包递推公式:

能否装满背包: dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])

  • 动态规划:416.分割等和子集(opens new window)
  • 动态规划:1049.最后一块石头的重量 II

装满背包有几种方法:dp[j] += dp[j - nums[i]]

  • 动态规划:494.目标和(opens new window)
  • 动态规划:518. 零钱兑换 II(opens new window)
  • 动态规划:377.组合总和Ⅳ(opens new window)
  • 动态规划:70. 爬楼梯进阶版(完全背包)

装满背包后,能装的最大价值: dp[j] = max(dp[j], do[j - nums[i]] + values[i])

  • 动态规划:474.一和零

装满背包后,所用的最小物品个数: dp[j] = min(dp[j], dp[j - nums[i]])

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

遍历顺序

01背包:遍历顺序无所谓

注意一下从二维到一维滚动数组的推导

完全背包:

先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。

但是仅仅是纯完全背包的遍历顺序是这样的,题目稍有变化,两个for循环的先后顺序就不一样了。

如果求组合数就是外层for循环遍历物品,内层for遍历背包

如果求排列数就是外层for遍历背包,内层for循环遍历物品

相关题目如下:

  • 求组合数:动态规划:518.零钱兑换II(opens new window)
  • 求排列数:动态规划:377. 组合总和 Ⅳ (opens new window)、动态规划:70. 爬楼梯进阶版(完全背包)(opens new window)

如果求最小数,那么两层for循环的先后顺序就无所谓了,相关题目如下:

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

对于背包问题,其实递推公式算是容易的,难是难在遍历顺序上,如果把遍历顺序搞透,才算是真正理解了

背包问题思维导图:

img

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

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

相关文章

网络编程 io_uring

io_uring 1、概述 io_uring是Linux&#xff08;内核版本在5.1以后&#xff09;在2019年加入到内核中的一种新型的异步I/O模型&#xff1b; io_uring使用共享内存&#xff0c;解决高IOPS场景中的用户态和内核态的切换过程&#xff0c;减少系统调用&#xff1b;用户可以直接向…

百度SEO快排原理是什么?如何快速排名方法?

前言&#xff1a;我之前说过我不打算写这个快速排序。 首先&#xff0c;我从来没有在自己的网站上操作过所谓的快速排序。 其次&#xff0c;我不能像网上很多人写的那样透露百度快速排序的秘密&#xff08;说实话&#xff0c;你可以透露秘密&#xff09;。 方法是有了&#xff…

Windows 11 23H2 based Tiny11 2311 中文输入法出错

参考&#xff1a; 1&#xff1a; Chinese IME dictionaries shows "not ready yet" in Windows Server 2022 - Windows Server | Microsoft Learn 2&#xff1a; Chinese basic typing not completing download - Microsoft Community 安装了 Tiny11 2311&#xff…

13. Springboot集成Protobuf

目录 1、前言 2、Protobuf简介 2.1、核心思想 2.2、Protobuf是如何工作的&#xff1f; 2.3、如何使用 Protoc 生成代码&#xff1f; 3、Springboot集成 3.1、引入依赖 3.2、定义Proto文件 3.3、Protobuf生成Java代码 3.4、配置Protobuf的序列化和反序列化 3.5、定义…

烧脑问题解决办法:如何选择一款合适自己的手机流量卡

现在社会人们越来越离不开手机了&#xff0c;手机给我们生活带来了翻天覆地的变化&#xff0c;手机需要最多的就是流量了&#xff0c;所以选择一款合适自己的手机流量卡就显得尤为重要了&#xff0c;今天小编就给大家来分享一下我的经验&#xff0c;希望对大家能有帮助&#xf…

【机器学习】FashionMNIST数据集简介及下载方法(自动下载)

【机器学习】FashionMNIST数据集简介及下载方法(自动下载) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订…

[c 语言] 大端,小端;网络序,主机序

在网络编程中&#xff0c;特别是底层网卡驱动开发时&#xff0c;常常遇到字节序问题。字节序指的是多字节数据类型在内存中存放的顺序&#xff0c;高位保存在低地址还是高地址&#xff0c;以此来划分大端还是小端。 1 大端和小端 大端和小端指的是 cpu 的属性&#xff0c;常见…

Linux命名管道

Linux匿名管道-CSDN博客 目录 1.原理 2.接口实现 3.模拟日志 Linux匿名管道-CSDN博客 这上面叫的是匿名管道&#xff0c;不要将两者搞混&#xff0c;匿名管道说的是两个有血缘关系的进程相互通信&#xff0c;但是命名管道就是两个没有关系的管道相互通信。 1.原理 和匿名…

智能驾驶规划控制理论学习03-基于采样的规划方法

目录 一、基于采样的规划方法概述 二、概率路图&#xff08;PRM&#xff09; 1、核心思想 2、实现流程 3、算法描述 4、节点连接处理 5、总结 三、快速搜索随机树&#xff08;RRT&#xff09; 1、核心思想 2、实现流程 3、总结 4、改进RRT算法 ①快速搜索随机图&a…

Docker知识点总结二

四、 Docker 架构 Docker使用客户端-服务器(C/S)架构模式&#xff0c;使用远程API来管理和创建Docker容器。 介绍&#xff1a; 1、Docker的客户端client&#xff0c;我们在命令行发送一些信息(命令)给Docker服务端。2、中间这个就是Docker的服务端&#xff0c;在这个服务端里面…

优选算法|【双指针】|1089.复写零

目录 题目描述 题目解析 算法原理讲解 代码 题目描述 1089. 复写零 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就…

初学者如何快速搭建基于 Selenium Grid 的分布式自动化

Selenium Grid是一个测试工具&#xff0c;它允许我们在不同的机器上针对不同的浏览器运行测试。 配置Hub 为了简单起见&#xff0c;我们将只使用一台机器来设置Hub&#xff0c;并在同一台机器上设置Node来运行测试。 1.需要安装Java 11或更高版本 2.需要安装浏览器 3.需要…