解析01背包 - 教程

news/2025/9/27 15:23:37/文章来源:https://www.cnblogs.com/tlnshuju/p/19115165

解析01背包 - 教程

2025-09-27 15:21  tlnshuju  阅读(0)  评论(0)    收藏  举报

目录

一、问题分析与动态规划思路

 二、二维DP数组实现(基础版)

三、空间优化(一维DP数组)

四、示例验证

五、总结


01背包问题是动态规划中的经典问题,它的核心是在物品只能选或不选的约束下,求背包能容纳的最大价值(本题中为重量)。下面我们从思路分析、代码实现到空间优化,一步步深入讲解。

一、问题分析与动态规划思路


问题定义

有  n  个物品,每个物品有体积  v_i  和重量  w_i ,背包最大体积为  V 。每个物品只能选或不选,求背包能装的最大重量。

动态规划状态定义

我们定义  dp[i][j]  表示前  i  个物品,背包体积为  j  时的最大重量。

状态转移方程

对于第  i  个物品(注意数组下标从0开始,所以代码中是  i-1  索引),有两种选择:

- 不选: dp[i][j] = dp[i-1][j] (继承前  i-1  个物品的状态)。
- 选:如果当前物品体积  v_i ≤ j ,则  dp[i][j] = dp[i-1][j - v_i] + w_i (选了第  i  个物品,剩余体积  j - v_i  装前  i-1  个物品的最大重量,加上当前物品重量)。


综上,状态转移方程为:

dp[i][j] = \begin{cases}
dp[i-1][j] & \text{if } v_i > j \\
\max(dp[i-1][j],\ dp[i-1][j - v_i] + w_i) & \text{if } v_i \leq j
\end{cases}

 二、二维DP数组实现(基础版)


先看基础的二维动态规划实现,代码如下:

#include
class Solution {
public:
int knapsack(int V, int n, vector>& vw) {
// dp[i][j]:前i个物品,背包体积j时的最大重量
vector> dp(n + 1, vector(V + 1, 0));
for (int i = 1; i <= n; i++) {  // 遍历物品
for (int j = 1; j <= V; j++) {  // 遍历背包体积
if (vw[i-1][0] <= j) {  // 当前物品体积<=背包剩余体积,可选择“选”或“不选”
dp[i][j] = max(dp[i-1][j], dp[i-1][j - vw[i-1][0]] + vw[i-1][1]);
} else {  // 物品体积超过背包剩余体积,只能“不选”
dp[i][j] = dp[i-1][j];
}
}
}
return dp[n][V];
}
};

思路解释:

- 初始化  dp[0][j] (前0个物品,即没有物品)时,最大重量为0; dp[i][0] (背包体积为0)时,最大重量也为0。
- 外层循环遍历每个物品,内层循环遍历每个可能的背包体积,根据状态转移方程更新  dp  数组。

三、空间优化(一维DP数组)


观察状态转移方程可以发现, dp[i][j]  只依赖于  dp[i-1][...] (即上一层的状态)。因此可以将二维数组优化为一维数组,降低空间复杂度。

优化思路

用  dp[j]  表示背包体积为  j  时的最大重量。此时需要逆序遍历背包体积,避免同一物品被重复选择(保证每个物品只选一次,符合01背包的约束)。

优化后的代码如下:

#include
class Solution {
public:
int knapsack(int V, int n, vector>& vw) {
// dp[j]:背包体积为j时的最大重量
vector dp(V + 1, 0);
for (int i = 1; i = vw[i-1][0]; j--) {
dp[j] = max(dp[j[j dp[j - vw[i-1][0]] + vw[i-1][1]);
}
}
return dp[V];
}
};

思路解释:

- 逆序遍历背包体积  j ,使得每次更新  dp[j]  时, dp[j - v_i]  还是“上一层”(即不包含第  i  个物品)的状态,保证了每个物品只被选一次。
- 空间复杂度从 O(n \times V) 优化到 O(V),时间复杂度仍为 O(n \times V),满足题目“进阶 O(n \cdot v)”的要求。

四、示例验证


以题目中的示例1为例:

- 输入: V=10, n=2, vw=[[1,3],[10,4]] 
- 二维DP过程:
- 当  i=1 (第一个物品,体积1,重量3):
- 对于  j≥1 , dp[1][j] = max(dp[0][j], dp[0][j-1]+3) = 3 (因为  dp[0][j]  是0)。
- 当  i=2 (第二个物品,体积10,重量4):
- 当  j<10  时,只能不选, dp[2][j] = dp[1][j] = 3 ;
- 当  j=10  时, dp[2][10] = max(dp[1][10]=3, dp[1][0]+4=4) ,所以结果为4。
- 一维DP过程:
- 初始  dp = [0,0,0,...,0] (长度11)。
- 处理第一个物品(体积1,重量3):
- 逆序遍历  j=10  到  j=1 , dp[j] = max(dp[j[j dp[j-1]+3) ,最终  dp = [0,3,3,...,3] (共10个3)。
- 处理第二个物品(体积10,重量4):
- 逆序遍历  j=10  到  j=10 , dp[10] = max(3, dp[0]+4)=4 ,最终结果为4。

两种方法都能正确得到示例的返回值 4 。

五、总结


01背包问题的核心是动态规划的状态定义与转移,通过二维DP数组可以直观理解状态转移过程,再通过逆序遍历的一维DP数组实现空间优化。这种优化思路不仅适用于“重量最大化”的场景,也适用于“价值最大化”等变种01背包问题,是动态规划中必须掌握的经典技巧。

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

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

相关文章

电脑显示器黑屏(闪烁:隔几秒中黑一两秒),向日葵远程正常——DeepSeek问答

这个问题非常深入,答案比“非此即彼”要复杂一些,因为它取决于具体的系统配置和硬件架构。总的来说,有两种主要情况。 1. “桌面画布”位于哪里?(显存 vs 主内存) 这主要取决于您使用的是独立显卡 还是集成显卡。…

夜场建设网站重庆网络技术有限公司

单例模式一般分为懒汉模式和饿汉模式&#xff0c;懒汉式单例在第一次引用时创建实例&#xff0c;不是在类加载时&#xff1b;饿汉式单例模式是一种在类加载时就创建实例的方式&#xff0c;因此也称为静态初始化。 单例模式实现的技巧时构造私有&#xff0c;向外提供静态实例。…

企业网站 dede phpcms 帝国团队建设网站

1、Configuration Bean 2、Compoent ComponentScan Component标记了&#xff0c;哪些类需要被扫描&#xff0c;ComponentScan指定了哪些包路径下的标记类可以被扫描 Component 如果不指定范围&#xff0c;默认从启动类所在包开始&#xff0c;扫描当前包及其子级包下的所有文…

实用指南:iOS 26 兼容测试实战,机型兼容、SwiftUI 兼容性改动

实用指南:iOS 26 兼容测试实战,机型兼容、SwiftUI 兼容性改动pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Co…

深入解析:Tomcat

深入解析:Tomcatpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Cou…

做类似淘宝网站怎么做专业3合1网站建设电话

前段时间&#xff0c;小灰发布了红黑树相关的文章&#xff0c;分成上下篇来讲解。这一次&#xff0c;小灰把两篇文章做了整合&#xff0c;并且修正了红黑树删除部分的图片错误&#xff0c;感谢大家的指正。————— 第二天 —————————————————二叉查找树&a…

消息队列Apache Kafka教程 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

长春专业网站建设公司排名2345官方网站

jQuery模态框弹窗提示代码 下载地址 jQuery模态框弹窗提示代码

9.21~9.27 周总结

分类 dp 当状态分为几类,而且降维时每一类要降的维不一样,我们可以对每一类分别开 dp,用不同的状态设计达到优化目的。 CF2143D2 Inversion Graph Coloring (Hard Version) - 洛谷 构造交换器 在序列转换问题(即给…

大中午记梦

应该是我第一次写记梦 果然唐人到了哪都是最唐的,无论是在梦里/jk (做梦内容与现实相关,此时现实中已经下午两点多了,并且机房外响起了装修声) 以下为梦境: 不知道在什么地方,但应该不是机房,应该不是厕所,也…

浙江省城乡建设厅网站网址申请域名

目录 一、所有主机初始化 二、135、136服务器&#xff0c;部署DNS调度服务器 1、更改主机主从DNS服务器的主机名称 2、安装bind软件、修改主配置文件 3、修改区域配置文件 4、修改数据文件 5、启动named服务、修改网卡信息 6、解析 7、双网卡的话记得注释以下内容、注…

网站建设这个职业备案网站首页地址

目录 依赖安装 下载编译libgeos 下载编译proj4 编译Postgresql9 编译PostGIS2 启动postgresql服务 开通外部网络访问 数据库开启PostGIS扩展 查看PostGIS版本 升级PostGIS版本 依赖安装 这个命令里面安装的包可能会多&#xff0c;由于是编译GreenPlum用的&#xff0…

软件项目网站建设实验报告专门做财经的网站

odoo16默认情况下每周都会发送一个“系统各功能状态日报”的邮件&#xff0c;而且是所有人都发&#xff0c; 这个功能在哪配置呢&#xff1f; 今天研究了一下&#xff0c; 线索是“系统各功能状态日报”&#xff0c;先全文检索吧 #. module: digest #: model:digest.digest,na…

计算机毕业设计springboot我国制氢产业专利检索系统的设计与实现 基于Spring Boot框架的中国制氢产业专利检索平台开发与设计 Spring Boot手艺驱动的中国制氢产业专利检索系统构建

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

9.21~9.27

分类 dp 当状态分为几类,而且降维时每一类要降的维不一样,我们可以对每一类分别开 dp,用不同的状态设计达到优化目的。 CF2143D2 Inversion Graph Coloring (Hard Version) - 洛谷 构造交换器 在序列转换问题(即给…

Jetbrains 全家桶激活码激活

本文介绍了JetBrains系列软件的激活方法:首先访问指定网站,选择可用链接下载压缩包并解压;运行install脚本后,从网站复制对应软件的激活码;最后在目标软件中粘贴激活码完成激活。已激活过JetBrains软件的用户只需…

Arbess从入门到实战(3) - 启用Arbess+GitLab实现Vue.js计划自动化部署

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

机关网站建设需求文档涪陵网站制作

文章目录 【Unity】终极移动指南-注解&#xff08;从移动、抓钩到贪吃蛇&#xff09;观前提醒链接地址&#xff1a; 内容一、 transform移动操作【1】transform.position变换位置【2】transform.Translate平移【3】transform.position 类似平移的操作【4】定向矢量【5】停在指定…

网站服务器内网打不开网页网站建设开场白

目录 一、创建项目二、first demo1、application.properties2、ChatController3、结果 三、个人思考 一、创建项目 官方文档的Getting Started 最低要求&#xff1a;JDK17 阿里云的Server URL&#xff08;https://start.aliyun.com/&#xff09;搜不到Spring AI&#xff0c;…