研习代码 day40 | 完全背包 多重背包的应用(一维滚动数组)

一、单词拆分(完全背包)

        1.1 题目

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

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

示例 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

提示:

  • 1 <= s.length <= 300
  • 1 <= wordDict.length <= 1000
  • 1 <= wordDict[i].length <= 20
  • s 和 wordDict[i] 仅由小写英文字母组成
  • wordDict 中的所有字符串 互不相同

        1.2 题目链接

        139.单词拆分

        1.3 解题思路和过程想法

        (1)解题思路       

        # 利用单词(物体)构成字典(背包)

        # 数组:字典 i 之前的所有部分是否能由单词构成 dp[i]
        # 初始化:为在后续处理中便于被覆盖,初始化其为 False
                        dp = [False] * (len(s) + 1)
        # 初始化空格位置为 True ,不会影响后续元素的判断
                        dp[0] = True
        # 递推关系:若当前物体之前的位置为true,且当前位置的单词存在于字典中
                        dp[j] = dp[j] or (dp[j-len(word)] and word == s[j-len(word):j]) 

        (2)过程想法

        总体的思路很好理解,但需构思递推关系怎么写

        1.4 代码

class Solution:def wordBreak(self, s: str, wordDict: List[str]) -> bool:# 利用单词(物体)构成字典(背包)# 数组:字典 i 之前的所有部分是否能由单词构成 dp[i]# 初始化:为在后续处理中便于被覆盖,初始化其为 Falsedp = [False] * (len(s) + 1)# 初始化空格位置为 True ,不会影响后续元素的判断dp[0] = True# 递推关系:若当前物体之前的位置为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)]

二、携带矿石资源(多重背包)

        1.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;

        1.2 题目链接

        56.携带矿石资源

        1.3 解题思路和过程想法

        (1)解题思路

        # 用矿石(物品)装满宇航仓(背包),因为每种物体的数量是有限但不都为1 ,属于多重背包问题,处理思路:在 0-1 背包的基础上,加上数量判断。

         # 数组:宇航仓容量为 j 时,其最大能获取的价值为 dp[j]
        # 初始化:求最大,且没有负值,初始化为 0,便于覆盖
                    dp = [0] * (bagWeight + 1)
        # 递推关系:dp[j] = max(dp[j], dp[j-weight[i]]+value[i])
        # 01背包问题——先遍历物体,再遍历背包容量

        (2)过程想法

        卡哥说面试大多考 0-1 背包和完全背包问题,这类多重背包问题参考看看即可

        1.4 代码

def read_input():# 创建四个空列表,用于存储四个数字列表values = []weights = []nums = []for i in range(4):# 使用input函数获取用户输入line = input("".format(i+1))# 根据行号存储到相应的列表中if i == 0:C, N = map(int, line.strip().split())elif i == 1:weights = list(map(int, line.strip().split()))elif i == 2:values = list(map(int, line.strip().split()))elif i == 3:nums = list(map(int, line.strip().split()))return C, N, weights, values, numsdef maxValue(bagWeight,N,weights,values,nums):# 用矿石(物品)装满宇航仓(背包)# 数组:宇航仓容量为 j 时,其最大能获取的价值为 dp[j]# 初始化:求最大,且没有负值,初始化为 0,便于覆盖dp = [0] * (bagWeight + 1)dp[0] = 0# 递推关系:dp[j] = max(dp[j], dp[j-weight[i]]+value[i])# 01背包问题——先遍历物体,再遍历背包容量for i in range(N):                                      # 遍历物体for j in range(bagWeight,weights[i]-1,-1):          # 倒序遍历背包容量for k in range(1,nums[i]+1):                    # 遍历物体数量if j - k * weights[i]  >= 0:    # 乘以 k 是因为一维滚动数组的潜在含义:依次遍历物体的种类dp[j] = max(dp[j], dp[j- k * weights[i]]+ k * values[i])  else:breakreturn dp[bagWeight]if __name__ == "__main__":# 调用函数并获取输入的数字列表C, N, weights, values, nums = read_input()print(maxValue(C,N,weights,values,nums))

三、刷题提示

        3.1 递推关系种类

                3.1.1 装满背包(max)        dp[j] = max(dp[j], dp[j - weight[i]] + value[i])
                                分割等和子集
                                最后一块石头的重量
                                一和零
                3.1.2 装满背包的方法数       dp[j] = min(dp[j - coins[i]] + 1, dp[j])
                               
目标和
                                零钱兑换 II
                                组合总和 IV
                                爬楼梯的进阶版
                3.1.3 装满背包的最小数量    dp[j] += dp[j - nums[i]
                                零钱兑换
                                完全平方数

        3.2 遍历背包的顺序

                3.2.1 完全背包的组合问题        先遍历物体,再遍历背包容量
                               零钱兑换 II
                3.2.2 完全背包的排列问题        先遍历背包容量,再遍历物体
                                组合总和 IV
                                爬楼梯的进阶版
                3.3 求最小数                                内外循环遍历顺序不影响最终结果
                                零钱兑换
                                完全平方数

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

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

相关文章

接收网络包的过程——从硬件网卡解析到IP层

当一些网络包到来触发了中断&#xff0c;内核处理完这些网络包之后&#xff0c;我们可以先进入主动轮询 poll 网卡的方式&#xff0c;主动去接收到来的网络包。如果一直有&#xff0c;就一直处理&#xff0c;等处理告一段落&#xff0c;就返回干其他的事情。当再有下一批网络包…

SUM()用法,C# ??用法,强制转换为Int类型错误

错误写法: 报错:到值类型“System.Int32”的强制转换失败&#xff0c;因为具体化值为 null。 int a mesPend.Where(p > p.PendStartTime.Month a && p.PendStartTime.Day < d). Select(p > DbFunctions.DiffSeconds(p.PendStartTime, p.PendEndTime.Value…

基于51单片机的交通信号灯系统【程序+proteus仿真+参考论文+AD原理图等16个文件夹资料】

一、项目功能简介 整个设计系统由STC89C52单片机数码管显示模块LED指向灯模块三线八线译码器模块按键模块组成。 具体功能&#xff1a; 1、东西向、南北向依次进行周期通行&#xff0c;默认设置为&#xff1a;东西向直行&#xff08;绿灯&#xff09;时间30秒&#xff0c;左转…

Mindomo Desktop for Mac免费思维导图软件,助您高效整理思维

思维导图是一种强大的工具&#xff0c;可以帮助我们整理思维、提高记忆力、激发创造力。而Mindomo Desktop for Mac作为一款免费的思维导图软件&#xff0c;能够帮助我们更高效地进行思维整理和项目管理。在本文中&#xff0c;我们将介绍Mindomo Desktop for Mac的功能和优势&a…

曲线拟合:走进数据建模中的艺术与科学

在现代科学和工程领域&#xff0c;曲线拟合是一项重要的数据分析技术&#xff0c;它可以通过数学模型来近似描述实际数据中的复杂关系。本文将详细介绍曲线拟合的基本概念、方法和应用领域&#xff0c;并探究其在数据建模中的艺术与科学。 第一节&#xff1a;曲线拟合的基本概…

LabVIEW当鼠标悬停在图形曲线上时显示坐标

LabVIEW当鼠标悬停在图形曲线上时显示坐标 在波形图上显示波形数据后&#xff0c;当鼠标放在波形图的曲线上时&#xff0c;如何自动显示对应点的坐标&#xff1f; 1. 创建事件结构&#xff0c;选择“波形图”作为“事件源”&#xff0c;选择“鼠标移动”作为“事件”&a…

【Vue】vue指令

目录 V-html v-show和v-if v-show 显示 隐藏 v-if 显示 隐藏 总结 显示隐藏的应用场景 未登录的情况 登录的情况 v- else 和 v-else-if v-if 和v-else v-if 和 v-else-if 总结&#xff1a; v-on 语法一&#xff1a; 语法二&#xff1a; 调用传参 v-bind…

3D建模对制造企业的价值

除非你在过去几年一直躲在岩石下,否则你可能听说过“3D 建模”和“3D 渲染”这些术语。 但为什么这项技术如此重要,尤其是对于产品制造公司而言? 简而言之,它减少了项目时间和成本。 这为制造商提供了更多的设计试验空间。 未能利用 3D 建模技术的公司很快就会落后于竞争对…

12 月 3 日北京,工业互联网数据管理的前沿技术+行业应用洞察尽在于此!

下一个周末&#xff0c;12 月 3 日&#xff0c;2023 IoTDB 用户大会将在北京丽都皇冠假日酒店举办&#xff01; 为让大家收获专业、多样的行业前瞻&#xff0c;我们邀请到了超 20 位产、学、用、研大咖嘉宾&#xff0c;将从技术与应用两个方向&#xff0c;带来你最想了解的工业…

论文阅读_生成式Agent

英文名称: Generative Agents: Interactive Simulacra of Human Behavior 中文名称: 生成代理&#xff1a;**人类行为的交互式模拟** 文章: http://arxiv.org/abs/2304.03442 代码: https://github.com/joonspk-research/generative_agents 作者: Joon Sung Park 机构: 斯坦福大…

【Rxjava详解】(七)线程调度原理

rxjava最终章 // 创建一个被观察者&#xff0c;在后台线程执行网络请求Observable<String> observable Observable.just("Network Response").subscribeOn(Schedulers.io()).doOnNext(result -> {// 模拟网络请求的耗时操作try {Thread.sleep(2000);} cat…

【教学类-06-08】20231125(55格版)X-Y之间“减法-题”(以10-20之间为例)(必须X>Y,题目少)

图片展示 需求&#xff1a; 20以内减法&#xff0c;不需要再练习其中10以内部分&#xff0c;改为10-20以内的减法&#xff0c;X-Y大于10&#xff0c;小于20的所有减法题。 代码展示&#xff1a; “-”减法 X-Y 之间的所有减法-题&#xff08;如10-20之间的所有减法&#xff0…

TDA笔记:夏克林老师,南洋理工大学

TDA比传统的统计方法有优势&#xff1a;benchmark中展现了这种优势 laplacian矩阵 多种单纯复形构造方式&#xff0c;可以构造出不同表征 二部图&#xff1a;Dowker complex Tor algebra可以用到多大数据 目前较新

Python基础教程之循环结构详解,循环结构逻辑解析。

文章目录 前言一、While循环二、While…else…循环三、for循环四、for…else…循环五、循环体结束语句六、嵌套循环关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③…

NX二次开发UF_CURVE_ask_curve_turn_angle 函数介绍

文章作者&#xff1a;里海 来源网站&#xff1a;https://blog.csdn.net/WangPaiFeiXingYuan UF_CURVE_ask_curve_turn_angle Defined in: uf_curve.h int UF_CURVE_ask_curve_turn_angle(tag_t curve, double orientation [ 3 ] , double * angle ) overview 概述 Returns …

[架构之路-250]:目标系统 - 设计方法 - 软件工程 - 需求工程 - 需求开发:如何用图形表达需求,面向对象需求分析OOA与UML视图

目录 一、面向对象需求分析 1.1 面向对象的基本概念 1.2 什么是面向对象的需求分析 2.3 什么是UML图 2.4 UML视图 2.4 UML图与UML视图的关系 2.5 UML图与面向对象需求分析的关系 二、需求分析相关的UML图形与视图&#xff1a;14视图 2.1 用例模型与用例图&#xff1a;…

Unity优化——脚本优化策略1

Hello&#xff0c;大家好&#xff0c;这里是七七&#xff0c;今天来给大家介绍的是Unity脚本中的一些优化策略。 目录 一、最快方法获取组件 二、移除空的回调定义 三、缓存组件引用 四、共享计算输出 五、Update、Coroutines和InvokeRepeating 一、最快方法获取组件 Ge…

面试题:工作中做过 JVM 调优吗?怎么做的?

文章目录 前言cpu占用过高死锁内存泄漏上面只是其中一种处理方法 总结 前言 最近很多小伙伴跟我说&#xff0c;自己学了不少JVM的调优知识&#xff0c;但是在实际工作中却不知道何时对JVM进行调优。今天&#xff0c;我就为大家介绍几种JVM调优的场景。 在阅读本文时&#xff…

github使用token认证

向github提交代码时报错&#xff1a;Support for password authentication was removed on August 13, 2021. Please use a personal access token instead。大概意思就是&#xff0c;原先的密码凭证从2021年8月13日开始就不能用了&#xff0c;后续必须使用个人访问令牌&#x…

死磕Nacos系列:Nacos在我的SpringCloud项目中做了什么?

Nacos服务注册 我们一个SpringCloud项目中集成了Nacos&#xff0c;当项目启动成功后&#xff0c;就可以在Nacos管理界面上看到我们项目的注册信息&#xff0c;还可以看到项目的健康状态等等信息&#xff1a; 那Nacos是什么时候进行了哪些操作的呢&#xff1f;今天我们来一探究…