day42|动态规划4-背包问题分割等和子集

news2024/11/28 15:58:18

0-1背包和完全背包搞清楚即可。
在这里插入图片描述

0-1背包问题-一维

背包有最大重量的限制,物品有重量有价值,那么在最大背包的限制下,能够得到的最大价值是多少?

暴力解法

每个物品都有放和不放两种状态,那么遍历所有的组合就可以得到背包问题的暴力解法。

动态规划

  1. dp[j]:容量为j的背包所能达到的最大价值
  2. 递推公式:
    dp[j] = max(dp[j],dp[j-weight[i]]+value[j])
  3. 初始化 dp[0] = 0
  4. 遍历顺序:第一个for循环遍历物品,第二个遍历背包并且是倒序遍历
  1. 为什么需要倒序遍历重量:防止一个物品被多次遍历,反过来才能够保证物品不被多次遍历。
  2. 为什么需要先遍历物品再遍历背包:如果先遍历背包再遍历物品那么会导致dp数组中的所有数值均为同一个数值。
  1. 打印dp数组
def test_1_wei_bag_problem():
    weight = [1, 3, 4]
    value = [15, 20, 30]
    bag_weight = 4
    # 初始化: 全为0
    dp = [0] * (bag_weight + 1)

    # 先遍历物品, 再遍历背包容量
    for i in range(len(weight)):
        for j in range(bag_weight, weight[i] - 1, -1):
            # 递归公式
            dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

    print(dp)

test_1_wei_bag_problem()

0-1背包问题-二维

  1. dp数组的含义:dp[i][j]下标为0-i之间的物品,任取放进容量为j的背包里
  2. 递推公式
    不放物品i,j中可以放的最大价值为dp[i-1][j]
    放物品i,dp[i-1][j-weight[i]](不放物品i的最大价值)+ value[i]
    那么此时的递推公式为:两个部分的值取max
    在这里插入图片描述
  3. 遍历顺序

对于二维数组的0-1背包问题遍历两个均可以。先遍历背包和物品都可以。

  1. dp数组的初始化
def test_2_wei_bag_problem1(bag_size, weight, value) -> int:
	rows, cols = len(weight), bag_size + 1
	dp = [[0 for _ in range(cols)] for _ in range(rows)]

	# 初始化dp数组.
	for i in range(rows):
		dp[i][0] = 0
	first_item_weight, first_item_value = weight[0], value[0]
	for j in range(1, cols):
		if first_item_weight <= j:
			dp[0][j] = first_item_value

	# 更新dp数组: 先遍历物品, 再遍历背包.
	for i in range(1, len(weight)):
		cur_weight, cur_val = weight[i], value[i]
		for j in range(1, cols):
			if cur_weight > j: # 说明背包装不下当前物品.
				dp[i][j] = dp[i - 1][j] # 所以不装当前物品.
			else:
				# 定义dp数组: dp[i][j] 前i个物品里,放进容量为j的背包,价值总和最大是多少。
				dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - cur_weight]+ cur_val)

	print(dp)

416. 分割等和子集

本题可以抽象成为0-1背包问题,物品的重量和价值均相等,如果当前重量与背包的重量相同即可得到最终是可以分成两个部分的。

二维数组

dp[i][j] :表示0-i个物体放在重量为j的背包中,所能够获得的最大价值

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        if sum(nums) % 2 != 0:
            return False
        # 二维情况
        target = sum(nums)//2
        rows, cols = len(nums),sum(nums)//2+1
        # 建立背包问题的二维数组
        dp = [[0 for _ in range(cols)] for _ in range(rows)]
        # 初始化dp数组
        for i in range(rows):
            dp[i][0] = 0
        for j in range(1,cols):
            if j >= nums[0]:
                dp[0][j] = nums[0]
        for i in range(1,rows):
            cur_weight = nums[i]
            cur_value = nums[i]
            for j in range(1,cols):
                # 递归公式
                if cur_weight > j:
                    dp[i][j] = dp[i-1][j]
                else:
                    dp[i][j] = max(dp[i-1][j],dp[i-1][j-cur_weight] + cur_value)
        return dp[-1][cols-1] == target

一维数组

dp[j] :表示容量为j的背包所能容纳的最大价值的物品是多少。
将每一个物品分别放入背包中,对背包的容积进行遍历即可。

class Solution:
    def canPartition(self, nums: List[int]) -> bool:
        # 一维数组的情况
        # dp[j]表述容量为j的背包所能达到的最大价值
        # 两层for循环不能颠倒
        if sum(nums) % 2:
            return False
        target = sum(nums) // 2
        dp = [0] * (target+1)
        # 先遍历物品再遍历背包
        for i in range(len(nums)):
            for j in range(target,nums[i]-1,-1):
                dp[j] = max(dp[j], dp[j-nums[i]]+nums[i])
        return dp[-1] == target

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

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

相关文章

谷歌浏览器 | Chrome DevTools系统学习篇- Elements面板(上)

大家好&#xff0c;文接上上回谷歌浏览器 | Chrome DevTools系统学习篇-概述&#xff0c;和上文谷歌浏览器 | Chrome DevTools系统学习篇-Device Mode。所谓“工欲善其事&#xff0c;必先利其器”&#xff0c;我们进一步来熟悉谷歌开发者工具。今天分享的是Elements元素&#x…

我在亚马逊云平台的学习成长之路

前言 今年是亚马逊云科技成立的第16个年头&#xff0c;也是云计算行业诞生的16周年。作为云计算时代的“领头羊”&#xff0c;亚马逊2006年推出了名为Amazon Web Services(AWS)的新产品。AWS背后的想法是提供一个平台&#xff0c;同亚马逊内部使用的平台一样&#xff0c;将其作…

Three.js--》实现3d地月模型展示

目录 项目搭建 初始化three.js基础代码 创建月球模型 添加地球模型 添加模型标签 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 项目搭建 本案例还…

230530-论文整理-课题组2

对这些研究有点兴趣颇微。 文章目录 Rethinking Dense Retrieval’s Few-Shot AbilityDecoder-Only or Encoder-Decoder? Interpreting Language Model as a Regularized Encoder-DecoderPLOME: Pre-training with Misspelled Knowledge for Chinese Spelling CorrectionRead…

北邮22信通:复习补充:双向链表的实现

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏&#xff1a; 北邮22信通_青山如墨雨如画的博客-CSDN博客 **说明** 最近复习看到书后有双向链表的题目&#xff0c;编出来供大家…

Mybatis-Plus 进阶开发-自定义乐观锁插件

文章目录 前言0. OptimisticLockerInnerInterceptor 介绍1. Mybatis-plus 实现乐观锁的原理2. 自定义乐观锁插件1. 创建自定义乐观锁插件2. 配置自定义乐观锁插件 3. 总结 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是冰点&#xff0c;从业11年&#xff0c;目前在…

jmeter 性能测试工具的使用(Web性能测试)

1、下载 2023Jmeter性能测试项目实战教程&#xff0c;十年测试大佬手把手教你做性能&#xff01;_哔哩哔哩_bilibili2023Jmeter性能测试项目实战教程&#xff0c;十年测试大佬手把手教你做性能&#xff01;共计11条视频&#xff0c;包括&#xff1a;1.什么是性能测试以及性能测…

爬虫进阶-反爬破解1(反爬技术简介、HTTP网络基础知识、搭建代理服务)

目录 一、反爬技术简介 二、HTTP网络基础知识 三、搭建代理服务 一、反爬技术简介 &#xff08;一&#xff09;破解Web端反爬技术 1.常见的反爬策略方向&#xff1a;同一时间的请求数量、请求的身份信息、浏览器和爬虫的区别 2.浏览器和爬虫的不同&#xff1a;异步数据加…

Maui初体验

创建Maui应用程序 使用vs创建项目&#xff0c;选择maui模板。 生成即可。 体验Font. 下载字体&#xff0c;放在Font文件夹下&#xff0c;或者子文件夹。 将 文件的生成操作改成MauiFont. 注册字体 如果在Font的子文件夹下&#xff0c;则需要编辑项目&#xff0c;修改ItemGrou…

SeaFormer实战:使用SeaFormer实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整算法设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试热力图可视化展示…

Ansible任务控制与Ansible-Playbook

YAML特点 YAML 文件以 # 为注释符 YAML 文件以 .yml或者.yaml 结尾 YAML 文件以 --- 开始 &#xff0c; 以 ... 结束&#xff0c;但开始和结束标志都是可选的 基本语法 大小写敏感 使用缩进表示层级关系 缩进时是使用Tab键还是使用空格- -定要达到统- &#xff0c;建议使用空格…

SpringMVC第七阶段:SpringMVC的增删改查(02)

1、图书列表功能的实现 需要导入JSTL标签库的jar包: druid-1.1.9.jar junit_4.12.jar mysql-connector-java-5.1.37-bin.jar org.hamcrest.core_1.3.0.jar spring-aop-5.2.5.RELEASE.jar spring-beans-5.2.5.RELEASE.jar spring-context-5.2.5.RELEASE.jar spring-core-5.2.5…

操作系统期末复习——课时八——进程同步(二)

1、信号量 信号量机制是一种功能较强的机制&#xff0c;可用来解决互斥和同步问题&#xff0c;它只能被两个标准的原语wait(S)&#xff08;P操作&#xff09;和signal(S)&#xff08;V操作 &#xff09;访问。 注意&#xff1a;原语是一种特殊的程序段&#xff0c;其执行只能一…

HNU-电子测试平台与工具2-I2C

FPGA I2C接口实现 计科210X wolf 202108010XXX 报告内容将包括: (1)如何描述组合电路、时序电路、状态机?如何编写TestBench? (2)ModelSim工具的使用; (3)EEPROM读写代码分析; (4)实验总结; 注意:其中(1)将在自定FSM中以实例的方式呈现,(2)将在(3)中提…

Java学习笔记22——异常

异常 异常异常的概述JVM处理异常的默认方案异常处理Throwable的成员方法编译时异常和运行时异常的区别异常处理throws自定义异常 异常 异常的概述 Throwable是所有异常和错误的超类 error表示严重的问题&#xff0c;合理的程序不应该试图捕获 Exception表示合理的应用想要捕…

chatgpt赋能python:Python中的{:5d}是什么?

Python中的{:5d}是什么&#xff1f; 在Python中&#xff0c;{:5d}是一种格式化字符串的方法&#xff0c;用于将整数格式化为一定宽度的字符串&#xff0c;其中{}代表占位符&#xff0c;5代表宽度&#xff0c;d代表将数据格式化为十进制整数。 简而言之&#xff0c;{:5d}的作用…

【pytest】tep环境变量、fixtures、用例三者之间的关系

tep是一款测试工具&#xff0c;在pytest测试框架基础上集成了第三方包&#xff0c;提供项目脚手架&#xff0c;帮助以写Python代码方式&#xff0c;快速实现自动化项目落地。 在tep项目中&#xff0c;自动化测试用例都是放到tests目录下的&#xff0c;每个.py文件相互独立&…

做接口测试需要哪些技能?一篇文章教你如何学会Python接口自动化测试

目录 1、什么是接口测试&#xff1f; 2、接口测试需要会什么&#xff1f; 3、如何学这些技能&#xff1f; 4、如何获取接口相关信息&#xff1f; 5、如何进行进行接口测试&#xff1f; 6、自动化接口测试 7、其他 1、什么是接口测试&#xff1f; 定义&#xff1a;测试系…

【反向面试】向你未来的软件雇主提出的36个问题

作者 | Tomas Fernandez 祝贺通过了面试&#xff01;你准备得很充分&#xff0c;并通过了所有的问题。现在你可以放松了。 "你有什么问题要问我们吗&#xff1f;” 面试官问道。哦&#xff01;这还没有结束&#xff0c;你意识到。你应该会有一些问题。 面试官并不是想让…

JVM学习(十三):面试中绕不开的String

一、String 的基本特性 1.1 String类的声明 String实现了Serializable接口&#xff0c;表示字符串是支持序列化的&#xff1b; 实现了Comparable接口&#xff0c;表示String可以比较大小 1.2 String的存储方式在jdk9中的变更 我们知道&#xff0c;String在jdk8中使用 final …