Day 37 | 01背包问题 、416. 分割等和子集

news/2024/10/6 4:17:27/文章来源:https://www.cnblogs.com/forrestr/p/18288115

01背包问题 二维dp

https://programmercarl.com/背包理论基础01背包-1.html
视频讲解:https://www.bilibili.com/video/BV1cg411g7Y6
有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。

思考

dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。

def test_2_wei_bag_problem1():weight = [1, 3, 4]value = [15, 20, 30]bagweight = 4# 二维数组dp = [[0] * (bagweight + 1) for _ in range(len(weight))]# 初始化for j in range(weight[0], bagweight + 1):dp[0][j] = value[0]# weight数组的大小就是物品个数for i in range(1, len(weight)):  # 遍历物品for j in range(bagweight + 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[len(weight) - 1][bagweight])test_2_wei_bag_problem1()

01背包问题 一维dp

https://programmercarl.com/背包理论基础01背包-2.html
视频讲解:https://www.bilibili.com/video/BV1BU4y177kY

思考

在一维dp数组中,dp[j]表示:容量为j的背包,所背的物品价值可以最大为dp[j]。

思考

使用滚动数组,先物品再背包。背包遍历需要逆序,正序的话上一层的左侧值就被覆盖了,无法滚动。

def test_1_wei_bag_problem():weight = [1, 3, 4]value = [15, 20, 30]bagWeight = 4# 初始化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])print(dp[bagWeight])

416. 分割等和子集

本题是 01背包的应用类题目
https://programmercarl.com/0416.分割等和子集.html
视频讲解:https://www.bilibili.com/video/BV1rt4y1N7jE

思考

暴力回溯太费事了。
转换为01背包问题。背包容量为sum/2,物品重量为nums[i],价值也是nums[i]
dp[i] 背包容量i是否可以装满

class Solution:def canPartition(self, nums: List[int]) -> bool:if len(nums)==1:return Falsesum_ = sum(nums)if sum_ % 2 !=0:return Falsek = int(sum_ / 2)# dp[i] 背包容量i是否可以装满dp = [False] * (k+1)dp[0] = Truefor num in nums:for i in range(k,0,-1):if i>=num:dp[i] = dp[i] or dp[i-num]return dp[k]

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

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

相关文章

使用 Kotlin 语言开发 NeoForge 模组

前言 Kotlin 是由 JetBrains 推出的一门基于 JVM 平台的编程语言,引入了许多不同于 Java 的先进概念以及语法糖,极大地提高了开发人员的编程效率,广受各路 Java 开发者推崇。但由于 NeoForge 官方并未就使用 Kotlin 开发模组提供支持,使得精通 Kotlin 的开发者未能使用所擅…

华为od面经(C++)

华为od面经(C++) 流程 5.20 机试 5.21 性格测试(从性格测试到HR面隔了一个月,期间在准备技术面) 6.20 HR面试 6.25 上午11:00 技术一面 6.25 下午6:00 技术二面 6.27 主管面 机考 100分:剩余银饰的重量,字符串序列判定,200分:数组排列求和。前两道题很简单,当时数组排…

算法金 | 一个强大的算法模型,GPR !!

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」抱个拳,送个礼 高斯过程回归(GPR)是一种非参数化的贝叶斯方法,用于解决回归问题。与传统的线性回归模型不同,GPR 能够通过指定的核函数捕捉复杂的非线性关系,并提…

[SNCPC2024] 2024 年陕西省大学生程序设计 J题猜质数II 题解

题目链接:CF 或者 洛谷 PS: CF的得等上gym。 前提说明 其实在上个月就见到这题了,当时很想做这题,结果找不到做题链接,也不知道出处,原来是陕西省赛的捧杯题。个人评价觉得是一道很不错的题,难度适中。 讲解 其实题解写的挺不错的,比很多比赛的题解写的详细许多了。这里…

[Redis]持久化

持久化 Redis的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证Redis的数据不会因为故障而丢失,这种机制就是Redis的持久化机制。 Redis的持久化机制有两种,第一种是快照,第二种是AOF日志。 快照是一次全量备份,AOF日志是连续的增量备份。 快…

Body SectionedSolidHorizontal

Body SectionedSolidHorizontal Body SectionedSolidHorizontal是通过使用两个或多个闭合轮廓(可能具有不同的尺寸)来表示产品的三维实体,这些轮廓沿准线在指定位置之间扫掠。应使用保持该几何表示的IfcShapeResentation的以下属性值:IfcShapeRepresentation.Representatio…

04.条件语句

if 语句if 的条件里可以赋值 if 的条件里赋值的变量作用域就在这个 if 语句里使用 if 语句打开 txt 文件package mainimport ("fmt""io/ioutil" )func main() {const filename = "test.txt"//返回两个值([]byte, error)文件内容和出错形式conten…

矢量数据库Chromadb的入门信息

一. 概述Chromadb是比较年轻的矢量数据库,也是LangChain默认使用的矢量数据库,使用简单,上手很容易。 官网地址:https://docs.trychroma.com/ Github:https://github.com/chroma-core/chroma二. 安装官网的指南:https://docs.trychroma.com/getting-started三. 使用模式内…

【Linux系列】Linux 性能调优工具的 9 张图

性能观察工具静态性能工具性能压测工具性能调优工具sarperf-tools追踪工具BPF性能工具

「杂文」算法竞赛之黑话大赏

欢迎投稿。写在前面 欢迎投稿。 罚时 一种根据选手完成题目的耗时,用于对通过题目数量相同的选手,进行排名的指标。 仅有选手成功通过的题目,才会计算罚时。 一道成功通过的题目的罚时为:选手第一次通过该题目时间,距离比赛开始时间之差,再加上未成功提交的罚时惩罚。 选…

汇编语言 5. [BX] 和 loop | 实验 4 : [BX] 和 loop 的使用

1) 2)向内存 0:200 - 0:23F (0020:0 ~ 0020:3f) 依次传递数据 0~63 , 只用9个指令 使用 bx 即用于偏移地址[bx] 也用于普通寄存器 bx assume cs:codecode segmentmov ax,0020hmov ds,ax ; ds : 0020h mov cx,64mov bx, 0s: mov [bx],bxinc bxloop s mov ax,4c00hint …