代码随想录算法训练营第四十五天(动态规划篇)|01背包

01背包理论基础

学习资料:代码随想录 (programmercarl.com)

 相关链接:题目页面 (kamacoder.com)

背包题目分类

01背包定义

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

解法

暴力解法

每种物品有两种状态:取或不取,因此可以用回溯法搜索出所有组合,选出价值最大的方案,时间复杂度为o(2^n)。

动态规划

举例:背包重量为4,物品为:

1. dp[i][j]定义

当前背包容量为j时, 从下标为[0, i]的物体中任意取,放到背包中,的最大价值。

    示意图如下:

   

2.递推公式

dp[i][j]可以从两个方向得到:

  • 放物品i: 由dp[i - 1][j - weight[i]]推出,即不放物品i时,容量为[j - weight[i]的背包(要给物品i流出放的重量)时的最大价值加上物品i的价值。
  • 不放物品i:由dp[i-1][j]推出,即容量为j,不放物品i时的最大价值。

递推公式为: dp[i][j] = max(dp[i-1][j], dp[i-1][j - weight[i]] + value[j])

3. 初始条件
  • 当背包容量为0时,那么不管从哪几个物体中选,最大价值总为0.
  • 当i为0时,即只能选择放入物品0或不放入物品0,想得到最大价值,肯定选择物品0最好, 但如果物品0重量大于背包容量时就无法放入,最大价值为0。
4. 遍历顺序

dp[i][j]由[i][j]位置的上方或者左上方得到,可以先遍历物品,也可以先遍历容量,我选择前者。具体步骤如下:

首先从dp[1][1]开始计算,当前物品1的重量(3)超过了背包总容量(1),所以无论之前的物品(这里指物品0)有没有放入背包,物品1都不可能放进去,所以背包的最大价值和在当前容量下放入物品1前的最大价值相同,即dp[1][1] = dp[0][1] = 15。dp[1][2]同理。

当背包扩容到3(即j = 3)时,直观来看,我们可以选择放入物品1,如果放入,就不能同时放入物品0,那么价值为20,如果不放物品1,可能的最大价值为只放物品0的价值,即15,因为20>15, 所以dp[1][3] = 20。把上述想法抽象总结如下:

容量大于物品1的容量,说明可以放入物品1。如果放入物品1,那留给前面的物体(这里指物品0)的容量只有j-wright[j](这里为0),所以前面物体能创造的最大价值为dp[i-1][j-weight[j]], 加上物品j后的价值为dp[i - 1][j - weight[j]] + value[i], 如果不放入物品1,那就和之前的情况一样,即dp[i-1][j]。取这两种情况价值大的,即max(dp[i - 1][j - weight[j]] + value[i], dp[i-1][j])。

5. 举例推导dp数组

在纸上举例,能写出下面的数组。

代码实现

在ACM模式下,Python的输入模式基础语句为下:

# 读取一个整数
n = int(input()) # 一行里有n个整数, 表示数据
a = list(map(int, input(),split()))# 一行里面有两个整数
n, m = map(int, input().split()) # 如果有多行数据,则按照每行的顺序依次执行上述对应指令
objNum, bagWeight = map(int, input().split())weight = [int(i) for i in input().split()]
value = [int(i) for i in input().split()]dp = [[0]*(bagWeight+1) for i in range(objNum)]
for j in range(bagWeight+1):if j >= weight[0]:dp[0][j] = value[0]for i in range(1, objNum): # 遍历for j in range(1, bagWeight+1):if weight[i] > j: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[objNum - 1][bagWeight])

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

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

相关文章

uniCloud ---- schema2code

目录 schema2code有两种方式 label属性 component属性 group属性 应用 DB Schema里有大量的信息,其实有了这些信息,前端将无需自己开发表单维护界面,uniCloud可以自动生成新增、修改、列表、详情的前端页面,以及admin端的列…

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-8.16再使用微信3.9.7.29

在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-8.16再使用微信3.9.7.29 《在openSUSE-Leap-15.5-DVD-x86_64中使用deepin-wine-6.0.0.62再使用微信3.9.5》 https://blog.csdn.net/weixin_42145772/article/details/135074804?spm1001.2014.3001.5501 按照上面文章的方法…

【iOS ARKit】人形提取

为解决人形分离和深度估计问题,ARKit 新增加了 Segmentation Buffer(人体分隔缓冲区)和Estimated Depth Data Buffer(深度估计缓冲区)两个缓冲区。人体分隔缓冲区作用类似于图形渲染管线中的 Stencil Buffer&#xff0…

挂耳耳机哪个牌子好?推荐几款性价比超高的挂耳耳机

在寻求更轻便舒适的听音体验时,挂耳耳机逐渐成为众多用户的优先选择。市场上各式各样的耳挂耳机琳琅满目,种类繁多,挂耳耳机哪个牌子好?为了帮助大家更好地了解耳挂耳机的市场状况,我推荐几款性价比超高的挂耳耳机。 挂…

《Python 网络爬虫简易速速上手小册》第7章:如何绕过反爬虫技术?(2024 最新版)

文章目录 7.1 识别和应对 CAPTCHA7.1.1 重点基础知识讲解7.1.2 重点案例:使用Tesseract OCR识别简单CAPTCHA7.1.3 拓展案例 1:使用深度学习模型识别复杂CAPTCHA7.1.4 拓展案例 2:集成第三方 CAPTCHA 解决服务 7.2 IP 轮换与代理的使用7.2.1 重…

react 之 UseMemo

useMemo 看个场景 下面我们的本来的用意是想基于count的变化计算斐波那契数列之和,但是当我们修改num状态的时候,斐波那契求和函数也会被执行,显然是一种浪费 // useMemo // 作用:在组件渲染时缓存计算的结果import { useState …

Flex 布局教程

目录 一、Flex 布局是什么? 二、基本概念 三、容器的属性 1、flex-direction属性 2、flex-wrap属性 3、flex-flow属性 4、justify-content属性 5、align-items属性 6、align-content属性 四、项目的属性 1、order属性 2、 flex-grow属性 3、flex-s…

生存类游戏《幻兽帕鲁》从部署服务器到开始体验全过程

SteamDB数据显示,《幻兽帕鲁》上线24小时内,在线人数峰值便突破200万,跻身Steam历史排行榜第二位。随着热度进一步发酵,《幻兽帕鲁》官方发布推文称,游戏发售不到6天,销量已经突破了 800万份。欢迎大家在阿…

Unity接入GVoice腾讯实时语音

Unity接入GVoice腾讯实时语音 一、介绍二、注册GVoice创建项目语音服务1.创建项目2.申请语音权限3.项目管理查看SDK初始化的一些参数和基本信息4.GVoice检测 三、SDK下载SDK是分为两种类型:独立版集成板 SDK放入Unity工程中 四、语音代码写法五、GVoice踩坑语音权限…

板块零 IDEA编译器基础:第二节 创建JAVA WEB项目与IDEA基本设置 来自【汤米尼克的JAVAEE全套教程专栏】

板块零 IDEA编译器基础:第二节 创建JAVA WEB项目与IDEA基本设置 一、创建JAVA WEB项目(1)普通项目升级成WEB项目(2)创建JAVA包 二、IDEA 开荒基本设置(1)设置字体字号自动缩放 (2&am…

高速接口PCB布局指南(四)高速差分信号布线(二)

高速接口PCB布局指南(四)高速差分信号布线(二) 1.连接器和插座2.过孔不连续性缓解3.背钻残桩4.增大过孔反焊盘的直径5.使用过孔计数相等 tips:资料主要来自网络,仅供学习使用。 1.连接器和插座 实现穿孔插…

清华系2B模型杀出,性能吊打LLaMA-13B

2 月 1 日,面壁智能与清华大学自然语言处理实验室共同开源了系列端侧语言大模型 MiniCPM,主体语言模型 MiniCPM-2B 仅有 24 亿(2.4B)的非词嵌入参数量。 在综合性榜单上与 Mistral-7B 相近,在中文、数学、代码能力表现…