代码随想录算法训练营Day46 | 动态规划(8/17) 1.练习题 LeetCode 139.单词拆分 2.多重背包 3. 背包问题总结篇!

2023-09-16 00:02:00

背包问题要结束了!首先是今天的练习题,然后是多重背包的知识点,最后对这几天背包问题做一个总结!

1. 练习题

139. Word Break

Given a string s and a dictionary of strings wordDict, return true if s can be segmented into a space-separated sequence of one or more dictionary words.

Note that the same word in the dictionary may be reused multiple times in the segmentation.

单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。

拆分时可以重复使用字典中的单词,说明就是一个完全背包!

class Solution:
    def wordBreak(self, s: str, wordDict: List[str]) -> bool:
        dp = [False]*(len(s) + 1)
        dp[0] = True 
        for j in range(1, len(s) + 1):
            for word in wordDict:
                if j >= len(word):
                    dp[j] = dp[j] or (dp[j - len(word)] and word == s[j - len(word):j])
        return dp[len(s)]

2. 多重背包

N种物品和一个容量为V 的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。求解将哪些物品装入背包可使这些物品的耗费的空间 总和不超过背包容量,且价值总和最大。
多重背包和01背包是非常像的, 为什么和01背包像呢?
每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。

但面试不会考,LeetCode也没有相关题目
 

3. 背包问题总结

背包问题是动态规划里的非常重要的一部分!

3.1 背包递推公式

问能否能装满背包(或者最多装多少):dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
问装满背包有几种方法:dp[j] += dp[j - nums[i]]
问背包装满最大价值:dp[j] = max(dp[j], dp[j - weight[i]] + value[i]);
问装满背包所有物品的最小个数:dp[j] = min(dp[j - coins[i]] + 1, dp[j]);

3.2 遍历顺序

3.2.1 01背包


二维dp数组01背包先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历。
一维dp数组01背包只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历。
一维dp数组的背包在遍历顺序上和二维dp数组实现的01背包其实是有很大差异的,这点需要注意!

3.2.2 完全背包


如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
背包问题最关键的两部:递推公式和遍历顺序。
 

更多推荐

抖音seo账号矩阵源码系统

1.开通多个抖音账号,并将它们归纳为一个账号矩阵系统。2.建立一个统一的账号管理平台,以便对这些账号进行集中管理,包括账号信息、内容发布、社区交互等。3.招募专业的运营团队,对每个账号进行精细化运营,包括内容制作、社区互动、数据分析等。4.建立账号矩阵系统的KPI体系,制定明确的目标和指标,对每个账号进行全面的数据分析

写一篇nginx配置指南

nginx.conf配置找到Nginx的安装目录下的nginx.conf文件,该文件负责Nginx的基础功能配置。配置文件概述Nginx的主配置文件(conf/nginx.conf)按以下结构组织:配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理、缓存、日志、虚拟主机等

关于嵌入式人工智能?

关于嵌入式人工智能?虽然学术界目前还没有嵌入式人工智能的确切定义,但随着人工智能的发展,势必会下沉到边缘、终端和嵌入式市场。嵌入式人工智能将会是未来几年AI发展的方向之一,并将伴随一系列的职位和角色涌现。最近很多小伙伴找我,说想要一些嵌入式学习资料,然后我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「嵌入式入

面试算法13:二维子矩阵的数字之和

题目输入一个二维矩阵,如何计算给定左上角坐标和右下角坐标的子矩阵的数字之和?对于同一个二维矩阵,计算子矩阵的数字之和的函数可能由于输入不同的坐标而被反复调用多次。例如,输入图2.1中的二维矩阵,以及左上角坐标为(2,1)和右下角坐标为(4,3)的子矩阵,该函数输出8。分析如果不考虑时间复杂度,则采用蛮力法用两个嵌套的循

基于SSM+Vue的乐购游戏商城系统

末尾获取源码开发语言:JavaJava开发工具:JDK1.8后端框架:SSM前端:采用Vue技术开发数据库:MySQL5.7和Navicat管理工具结合服务器:Tomcat8.5开发软件:IDEA/Eclipse是否Maven项目:是目录一、项目简介二、系统设计三、系统项目截图管理员功能模块前台功能模块用户功能模块四、

Pycharm中画图警告:MatplotlibDeprecationWarning

前言:\textcolor{Green}{前言:}前言:💞这是由于在python中画图出现的问题,一般不会有错。因为它只是个警告,但是我们也可以知道解决这个问题的方法,防止后面出问题的时候知道怎么解决。前因后果问题:原因解决方法一解决方法二问题:在使用Matplotlib的show方法时,控制台出现以下警告信息:Ma

【Python】Python 包 ③ ( Python 第三方包简介 | 安装第三方包 | 命令行安装 | PyCharm 安装 | 设置代理 | 使用第三方包开发 )

文章目录一、Python第三方包简介二、安装第三方包1、使用pip命令安装第三方包2、指定第三方包安装版本3、设置代理4、PyCharm中安装第三方包三、使用第三方包开发一、Python第三方包简介Python包中包含了很多Python模块,每个Python模块对应一个Python源码,其中包含了若干功能(函数);Py

Nginx配置文件详解

一、nginx的配置文件1、常见的配置文件及其作用nginx常见配置文件位置:安装路径/conf目录中。[root@centos7nginx]#tree.├──conf│├──fastcgi.conf│├──fastcgi.conf.default│├──fastcgi_params│├──fastcgi_params

pycharm中恢复原始界面布局_常用快捷键_常用设置

文章目录1恢复默认布局1.1直接点击file→ManageIDESettings→RestoreDefaultSettings(如下图所示):1.2直接点击RestoreandRestart,然后Pycharm就会自动重启,重启之后的界面就是最原始的界面了2改变主题2.1在PyCharm的右上角,点击“齿轮,然后点击:

ThreadPoolExecutor的使用

1.在SpringBoot项目中使用ThreadPoolExecutor:SpringBoot中可以通过创建一个配置类来定义ThreadPoolExecutor,然后在需要使用的地方直接注入即可。@ConfigurationpublicclassThreadPoolConfig{@BeanpublicExecutora

【OpenSSL】VC编译OpenSSL

VC编译OpenSSL编译工具准备编译OpenSSL建立`HelloWorld`工程创建VS工程编译工具准备安装好VisualStudio。安装Perl,主要是用来生成nmake的。准备好汇编语言编译工具nasm,并添加到path路径。下载好OpenSSL源代码。编译OpenSSL安装Perl,并加入到path路径,检

热文推荐