代码随想录算法训练营第35天|背包问题基础、46. 携带研究材料(01背包二维解法)(01背包一维解法)(acm)、416. 分割等和子集

news2024/9/21 4:05:06

目录

  • 0、背包问题基础
    • 01背包
  • 46. 携带研究材料(01背包)
    • 1、题目描述
    • 2、思路
    • 3、code(二维解法)
    • 3-1、code(一维解法)
    • 4、复杂度分析
  • 416. 分割等和子集
    • 1、题目描述
    • 2、思路
    • 3、code
    • 4、复杂度分析

0、背包问题基础

在这里插入图片描述

01背包

有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大
在这里插入图片描述

46. 携带研究材料(01背包)

题目链接:

1、题目描述

小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。
小明的行李空间为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料只能选择一次,并且只有选与不选两种选择,不能进行切割。

2、思路

非常标准的01背包问题

3、code(二维解法)

M, N = map(int, input().split())
weight = list(map(int, input().split()))
value = list(map(int, input().split()))
# 横坐标是材料,纵坐标是行李容量
dp = [[0 for _ in range(N+1)] for _ in range(M)]

# dp数组, dp[i][j]代表行李箱空间为j的情况下,从下标为[0, i]的物品里面任意取,能达到的最大价值
for i in range(0,M):
    dp[i][0] = 0
for j in range(1,N+1):
    if weight[0]<=j:
        dp[0][j] = value[0]
for i in range(0,M):
    for j in range(1,N+1):
        if j < weight[i]:
            dp[i][j] = dp[i-1][j]
        else:
            dp[i][j] = max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])
    
print(dp[M-1][N])

3-1、code(一维解法)

在这里插入图片描述

M, N = map(int, input().split())
# M = 3 N = 2
weight = list(map(int, input().split()))
value = list(map(int, input().split()))
# dp[j]代表行李空间为j能够携带的研究材料的最大值 j = 0 1 2
dp = [0] * (N+1)
# print(dp)
for i in range(0,M): # 0 1 2 
    for j in range(N,weight[i]-1,-1): # 2 
        dp[j] = max(dp[j],dp[j-weight[i]]+value[i])
        # dp[2] = max(dp[2],dp[2-2] +...)
print(dp[N])

4、复杂度分析

1️⃣ 时间复杂度: O ( M × N ) O(M \times N) O(M×N)
2️⃣ 空间复杂度: O ( M × N ) O(M \times N) O(M×N)

416. 分割等和子集

题目链接:link

1、题目描述

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

2、思路

把01背包问题套到本题上来。

  • 背包的体积为sum / 2
  • 背包要放入的商品(集合里的元素)重量为 元素的数值,价值也为元素的数值
  • 背包如果正好装满,说明找到了总和为 sum / 2 的子集。
  • 背包中每一个元素是不可重复放入。

3、code

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        # 物品重量为数值,价值为数值
        # 背包容量为总和的一半
        # 背包装满时获得的最大价值
        # 本体就是装满时(总和的一半)物品的数值和是否和背包容量一致
        if sum(nums) % 2 != 0:
            return False
        target = sum(nums) // 2
        # target = 11
        # dp[j]代表背包容量为j装的最大价值,j:0,1,2,,,,11
        dp = [0] * (target + 1)
        for i in range(len(nums)): # 物品从0,1,2,3 
            for j in range(target,nums[i]-1,-1): # 容量从11,,,,weight[0]
                dp[j] = max(dp[j],dp[j-nums[i]]+nums[i])
        if dp[target] == target:
            return True
        else:
            return False

4、复杂度分析

1️⃣ 时间复杂度: O ( n 2 ) O(n^2) O(n2)
2️⃣ 空间复杂度: O ( n ) O(n) O(n)

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

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

相关文章

如何有效地管理个人时间:策略与技巧

在快节奏的生活环境中&#xff0c;时间成为了最宝贵的资源之一。有效地管理时间不仅能提高工作效率&#xff0c;还能提升生活质量&#xff0c;使你有更多的时间投入到家庭、爱好和个人成长中去。本文将分享一些实用的时间管理技巧&#xff0c;帮助你更好地安排每日事务。 时间…

[HZNUCTF 2023 preliminary]easyAPK-快坚持不下去的第三天

第一做安卓题&#xff0c;前提jadx,java环境&#xff0c;模拟器&#xff0c;我配了好久&#xff0c; 这段代码实现了一个简单的登录界面&#xff0c;用户需要输入用户名和密码。用户名和密码会与预设的硬编码值进行比较&#xff0c;登录成功后会启动另一个 Activity。如果密码错…

TS 学习(一)

如果我们在 ts 中写 不用运行就能在文件中报错 ts 是一种静态类型的检查 能将运行时出现的错误前置 一般不用 命令行编译 ts 转换成 js 将中文转码 tsc index&#xff08;.ts&#xff09; 输入命令生成 配置文件 能在中间进行 配置转换成 js 的哪个规范 es5 还是 6 和其它转…

鸿蒙(API 12 Beta6版)图形【过度绘制调试使用指导】方舟2D图形服务

当应用页面布局的嵌套程度过深时&#xff0c;应用渲染阶段会存在一些组件的绘制指令被其他组件的绘制指令部分或完全覆盖遮挡的情况&#xff0c;造成冗余的cpu、gpu等计算资源的使用。这种一个屏幕上的像素点被重复绘制了多次的情况被称为过度绘制&#xff08;Overdraw&#xf…

Vite - 兼容旧版浏览器 plugin-legacy(2)

目录 1&#xff0c;问题2&#xff0c;解决3&#xff0c;String 其他新增 API 的版本 接上文 Vite - 兼容旧版浏览器 plugin-legacy&#xff08;1&#xff09; 1&#xff0c;问题 客户浏览器报错&#xff0c;不支持 replaceAll 方法。 该方法在 query-string 依赖内部使用了。…

通过生日计算年龄

// 获取当前月 function getDate(date) {let d new Date(date);// 将日期设置为下月一号d.setMonth(d.getMonth() 1);d.setDate(1);// 获取本月最后一天d.setDate(d.getDate() - 1);return d.getDate(); } // 获取年龄 传出生日期和当前日期&#xff0c;当前日期可以不用传 f…

双指针(1)_数组分块_移动零问题

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 双指针(1)_数组分块_移动零问题 收录于专栏【经典算法练习】 本专栏旨在分享学习C的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 1.…

ELK学习笔记(二)——使用K8S部署Kibana8.15.0

上篇文章我们完成了&#xff0c;ES的集群部署&#xff0c;如果还没有看过上篇文章的兄弟&#xff0c;可以去看看。 ELK学习笔记&#xff08;一&#xff09;——使用K8S部署ElasticSearch8.15.0集群 话不多说&#xff0c;接下来直接进入kibana的搭建 一、下载镜像 #1、下载官方…

hackme靶机通关攻略

1、登录靶机&#xff0c;查询是否有注入点 2、判断闭合方式 输入OSINT and 11 # 输入OSINT and 12 # 得出闭合方式为单引号 2、查询数据库名 输入-1 union select database(),2,3 # 3、查询数据库中的表 输入-1 union select group_concat(table_name),2,3 from informa…

搜维尔科技:数据手套+机械手遥操作,五指触感灵巧手解决方案!

本灵巧手模仿人手的自由度分配及相关运动学参数进行设计的灵巧手&#xff0c;整手的手指设计采用了模块化的思想。整机重量轻&#xff0c;单指指尖抓取力强&#xff0c;五指灵巧手作为人体机器人或者机械臂末端操作工具&#xff0c;在工业生产的特殊环境中&#xff0c;对复杂形…

Spring事务(2)——@Transaction详解

目录 一、rollbackFor 结论&#xff1a; 二、事务隔离级别 1、MySQL 事务隔离级别&#xff08;回顾&#xff09; 2、Spring 事务隔离级别 三、Spring 事务传播机制 1、什么是事务传播机制&#xff1f; 2、事务的传播机制有哪些&#xff1f; 3、Spring 事务传播机制使用…

基于SpringBoot技术的家具网站设计与实现

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot框架 工具&#xff1a;Eclipse、Navicat 系统展示 首页 家具详情界面 购物车界面 订单…

Python 数据分析— Pandas 基本操作(上)

文章目录 学习内容&#xff1a;一、Series 创建及操作二、DataFram 的创建与操作三、Pandas 的读写操作四、选择指定行列数据 学习内容&#xff1a; 一、Series 创建及操作 ** Series : Pandas 的一种数据结构形式&#xff0c;可理解为含有索引的一维数组。** **&#xff08;…

Python | Leetcode Python题解之第390题消除游戏

题目&#xff1a; 题解&#xff1a; class Solution:def lastRemaining(self, n: int) -> int:a1 1k, cnt, step 0, n, 1while cnt > 1:if k % 2 0: # 正向a1 stepelse: # 反向if cnt % 2:a1 stepk 1cnt >> 1step << 1return a1

【IPV6从入门到起飞】2-1 获取你的IPV6(手机、CPE等)

【IPV6从入门到起飞】2-1 获取你的IPV6&#xff08;手机、CPE等&#xff09; 1 IPV6就在身边2 手机IPV62.1 查看IPV62.2 IPV6 ping包测试2.3 IPV6入站测试 3 电脑通过CPE获取IPV63.1 拉不起宽带的打工人3.2 开始部署IPV6环境3.2.1 刷系统3.2.2 激活IPV63.2.3 设置防火墙入站&am…

Opencv实现提取卡号(数字识别)

直接开始 实行方法 解析命令行参数&#xff1a;使用argparse库来解析命令行输入&#xff0c;确保用户提供了输入图像和模板图像的路径。 读取模板图像&#xff1a;使用cv2.imread()函数读取模板图像的路径&#xff0c;并显示原始图像。 图像预处理&#xff1a; 将图像转换为…

ARM——结构体系(处理器工作模式,CPSR,立即数,汇编语言函数调用)

1、处理器工作模式 ARM有7个基本工作模式: User:非特权模式&#xff0c;大部分任务执行在这种模式FIQ:当一个高优先级(fast)中断产生时将会进入这种模式 IRQ:当一个低优先级(normal)中断产生时将会进入这种模式 Supervisor:当复位或软中断指令执行时将会进入这种模式 Abort:当存…

CAN总线数据帧的帧结构

CAN总线中的信息是以固定格式的“帧”发送的&#xff0c;当总线为空闲时&#xff0c;任何已连接的节点都可以开始发送一个新的“帧”。 在一个CAN系统中&#xff0c;数据在节点之间的发送和接收主要通过四种不同类型的“帧”来执行和控制。这四种类型分别是数据帧、远程帧、错…

探索ArrayList的线程不安全性

文章目录 概要示例代码原因解决用 synchronized 保证安全添加元素其他方法 总结 概要 要测试ArrayList的线程不安全性&#xff0c;可以创建多个线程同时对 ArrayList 进行修改操作&#xff08;如添加、删除元素&#xff09;&#xff0c;并观察是否会引发异常或数据不一致的问题…

Typescript实现react-redux的useSelector和useDispatch的状态定义

背景&#xff1a;react中使用typescript,在引入redux之后很多状态定义有问题&#xff0c;记录下来&#xff08;文章记录学习react-redux过程中的踩坑&#xff09;。 1.useSelector时&#xff0c;state语法报错&#xff0c;类型为unknown,如下图 我的store状态设置的很简单&am…