代码随想录算法训练营第46天 | 139.单词拆分 + 多重背包理论基础 + 背包问题总结

news2024/11/22 6:28:46

今日任务

目录

139.单词拆分 - Medium

多重背包理论基础

背包问题总结

递推公式

遍历顺序


139.单词拆分 - Medium

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

给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。

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

提示:单词就是物品,字符串s就是背包,单词能否组成字符串s,就是问物品能不能把背包装满。拆分时可以重复使用字典中的单词,那这就是一个完全背包问题

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

        return dp[len(s)]

多重背包理论基础

理论基础:代码随想录

有N种物品和一个容量为V 的背包。

第i种物品最多有Mi件可用,每件耗费的空间是Ci ,价值是Wi 。

求解将哪些物品装入背包可使这些物品的耗费的空间总和不超过背包容量且价值总和最大。

多重背包和01背包是非常像的, 每件物品最多有Mi件可用,把Mi件摊开,其实就是一个01背包问题了。使用这种方式实现的时间复杂度:O(m × n × k),m:物品种类个数,n背包容量,k单类物品数量

def test_multi_pack():
    weight = [1, 3, 4]
    value = [15, 20, 30]
    nums = [2, 3, 2]
    bagWeight = 10

    # 将数量大于1的物品展开
    for i in range(len(nums)):
        while nums[i] > 1:
            weight.append(weight[i])
            value.append(value[i])
            nums[i] -= 1

    dp = [0] * (bagWeight + 1)
    for i in range(len(weight)):  # 遍历物品
        for j in range(bagWeight, weight[i] - 1, -1):  # 遍历背包容量
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
        for j in range(bagWeight + 1):
            print(dp[j], end=" ")
        print()

    print(dp[bagWeight])


test_multi_pack()

另一种实现方式,就是把每种商品遍历的个数放在01背包里面在遍历一遍,时间复杂度同上

def test_multi_pack():
    weight = [1, 3, 4]
    value = [15, 20, 30]
    nums = [2, 3, 2]
    bagWeight = 10
    dp = [0] * (bagWeight + 1)

    for i in range(len(weight)):  # 遍历物品
        for j in range(bagWeight, weight[i] - 1, -1):  # 遍历背包容量
            # 以上为01背包,然后加一个遍历个数
            for k in range(1, nums[i] + 1):  # 遍历个数
                if j - k * weight[i] >= 0:
                    dp[j] = max(dp[j], dp[j - k * weight[i]] + k * value[i])

        # 打印一下dp数组
        for j in range(bagWeight + 1):
            print(dp[j], end=" ")
        print()

    print(dp[bagWeight])


test_multi_pack()

背包问题总结

总结:代码随想录

背包问题关系图: 

递推公式

  • 问能否能装满背包(或者最多装多少):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])

遍历顺序

01背包

  • 二维dp数组01背包:先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历
  • 一维dp数组01背包:只能先遍历物品再遍历背包容量,且第二层for循环是从大到小遍历

完全背包

  • 纯完全背包:一维dp数组实现,先遍历物品还是先遍历背包都是可以的,且第二层for循环是从小到大遍历
  • 求组合数:外层for循环遍历物品,内层for遍历背包

  • 求排列数:外层for遍历背包,内层for循环遍历物品

  • 求最小数:两层for循环的先后顺序无所谓

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

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

相关文章

操作系统——实现一个简单的 shell 命令行解释器

一:实验题目 实现一个简单的 shell 命令行解释器 二:实验目的 本实验主要目的在于进一步学会如何在 Linux 系统下使用进程相关的系统调用,了解 shell 工作 的基本原理,自己动手为 Linux 操作系统设计一个命令接口。 三&…

WebSocket是什么,怎么用

74. WebSocket是什么,怎么用 当涉及到实时通信和即时更新的需求时,WebSocket 是一种强大且常用的解决方案。 1. 什么是 WebSocket? WebSocket 是一种在客户端和服务器之间实现双向通信的协议。它允许服务器主动向客户端推送数据&#xff0…

在Mac上安装Aspectj1.9.8(用于Java17)

1. 确定所使用的Java版本和AspectJ的对应关系 2. 下载AspectJ包 3. 安装AspectJ 4. 添加AspectJ对应的环境变量 5. 测试AspectJ 5.1 简单命令行测试安装是否成功 5.2 在IDEA中添加对AspectJ的支持【todo】 5.3 敲测试代码并进行测试【todo】 -----------------------------…

如何将window文件夹挂载到VMware系统mnt目录

背景:项目开发过程中,通常是在Windows上编码,有些框架和软件只能够在Linux上面执行,如果在 VMware中的Linux上面开发不太方便,因此需要在Windows上面开发好再同步到Linux上面运行。 软件: Samba客户端 V…

nodejs安装及环境变量配置(修改全局安装依赖工具包和缓存文件夹及npm镜像源)

本机环境:win11家庭中文版 一、官网下载 二、安装 三、查看nodejs及npm版本号 1、查看node版本号 node -v 2、查看NPM版本号(安装nodejs时已自动安装npm) npm -v 四、配置npm全局下载工具包和缓存目录 1、查看安装目录 在本目录下创建no…

抓包技术的应用示例

前言 最近瑞幸在搞活动,每天免费送10000份咖啡,我是个不喝咖啡的人儿,所以没咋关注,今早我们的团宠小妹,拉着我 10点整拼手速,想着帮她抢一杯,于是点开瑞幸咖啡小程序主页,banner 栏…

数学建模常用算法之主成分分析

数学建模常用算法之主成分分析 引言步骤实例以及代码 引言 主成分分析是一种降维算法,它能将多个指标转换为少数几个主成分,这些主成分是原始变量的线性组合,且彼此之间互不相关,且能反映出原始数据的大部分信息。 一般来说&#…

机器学习笔记 - vision transformer(ViT)简述

一、ViT简述 视觉转换器 vision_transformer(ViT) 因其令人印象深刻的准确率和计算效率而迅速成为卷积神经网络 (CNN) 在计算机视觉任务中的首选替代品。ViT模型在许多数据集和任务组合中的表现比CNN高出近4倍,从而确立了自己作为非常强大的竞争者的地位。 同样,基于转换…

采样中断服务程序原理

采样中断服务程序框图如图2-6所示。采样中断服务程序主要包括采样计算,TV、TA断线自检和保护起动元件三个部分。同时还可以根据不同的保护特点,增加一些检测被保护系统状态的程序。 一、采样计算概述 进入采样中断服务程序,首先进…

抖音林客服务商入驻申请

抖音林客服务商后台提供了以下主要功能: 数据报告:可以查看账户的广告投放、效果等数据报告,并进行数据分析和优化。 广告投放平台:可以创建和管理广告投放计划、定向和出价等设置,以及监控广告投放效果。 …

【032】C++高级开发之继承机制详解(最全讲解)

C的继承机制详解 引言一、继承和派生1.1、继承的概念和意义1.2、派生类的定义 二、继承中的构造和析构2.1、子类的构造和析构顺序2.2、子类调用成员对象、父类的有参构造 三、子类和父类的同名处理3.1、子类和父类同名成员数据3.2、子类和父类同名成员函数3.3、子类重定义父类的…

2.5C++多重继承

C 多重继承概述 C中的多重继承是指一个派生类可以从多个基类中继承属性和方法。 多重继承的作用是让 C 中的类更灵活地组合,以及实现代码的高复用。 多重继承的语法如下: access_specifier可以是public、protected或private,用来指定继承…

python学习——文本数据处理

目录 1 计算长度 len2 大小写 lower、upper、title、capitalize、swapcase3 字符检索 get、slice4 元素提取 findall、extract5 索引操作 find、index6 字符类型判断,结果一定是True或False7 字符判断 contains、startswith、endswith8 替换 replace9 字符的分割 split、partit…

鸿蒙HarmonyOS开发环境初识及搭建

一 鸿蒙简介 HarmonyOS是一款面向万物互联时代的、全新的分布式操作系统。在传统的单设备系统能力基础上,HarmonyOS提出了基于同一套系统能力、适配多种终端形态的分布式理念,能够支持手机、平板、智能穿戴、智慧屏、车机等多种终端设备,提供…

A Sequence-to-Set Network for Nested Named Entity Recognition

原文链接: https://www.ijcai.org/proceedings/2021/0542.pdf IJCAI 2021 介绍 问题 将嵌套NER视为span分类任务存在两个缺陷,不仅搜索空间大还缺少了实体之间的交互。 IDEA 因此作者提出了sequence-to-set的模型,不再提前给定span&#x…

【数据分享】全国县市2000-2021年农业、工业数据(免费获取)

《中国县域统计年鉴》是一部全面反映我国县域社会经济发展状况的资料性年鉴,收录了上一年度全国2000多个县域单位的基本情况、综合经济、农业、工业、教育、卫生、社会保障等方面的资料。 之前基于《中国县域统计年鉴》我们分享了2000至2021年的综合经济数据&#…

详解eslint在vue中如何使用

ESLint在vue中的使用 阅读目录 .editorconfig文件(主要用于配置IDE).eslintignore文件(放置需要ESLint忽略的文件,只对.js文件有效).eslintrc.js 文件(用来配置ESLint的检查规则) ESLint的用途 1.审查代码是否符合编…

SwinTransformer与Vit细节总结

建议通过标题来快速跳转 Vit (Vision Transformer) Vit把图片打成了patch,然后过标准的TransformerEncoder,最后用CLS token来做分类 Vit的位置编码 作者在文中试了几种方式,发现这几种在分类上效果差不多 1-dimensional positional emb…

EMQ 明道云:零代码高效构建工业物联网设备管理平台

背景 智能物联网设备在 IIoT 场景中有着广泛的应用,但如何管理和监控这些设备是一个挑战。 明道云是一家专业的 hpaPaaS 平台服务商,其所开发的明道云平台(Mingdao Cloud)是一个企业软件设计和开发工具,让企业可以低…

[230608] 阅读TPO58汇总|7:30-9:00+17:05

目录 ​​​​​​​ TPO58 1 The Development of Instrumental Music [3]修辞目的题 举例说明的作用 [9]句子插入题 [10]小结题 2 Pinyon Pines and Pinyon Jays [4]否定事实信息题 [5]修辞目的题 段落在全篇的作用 [10]小结题 3 The Rise of Classic Maya Civi…