背包问题= =

news2025/1/14 18:07:43

一、01背包

N 件物品和一个容量是 V 的背包。每件物品只能使用一次。

i件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。(下图是例子,一下分析均由此图得来)

1、分析:

(1) 确定dp数组以及下标的含义

对于背包问题,有⼀种写法, 是使⽤⼆维数组,即dp[i][j] 表⽰从下标为[0-i]的物品⾥任意

取,放进体积为j的背包(即总体积不超过j),价值总和最⼤是多少。

dp[i][j]:表示所有选法集合中,只从前i个物品中选,并且总体积≤j的选法的集合,它的值是这个集合中每一个选法的最大值.

(2)划分集合、确定递推公式

划分集合:选不选物品i

不选i:由dp[i - 1][j]推出,即背包容量为j,⾥⾯不放物品i的最⼤价值,此时dp[i][j]就是

dp[i - 1][j]

选i:由dp[i - 1][j - w[i]]推出,dp[i - 1][j - w[i]] 为背包容量为j - w[i]的时

候不放物品i的最⼤价值,那么dp[i - 1][j - w[i]] + value[i] (物品i的价值),

就是背包放物品i得到的最⼤价值

所以递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);

(3)dp数组的初始化

关于初始化,⼀定要和dp数组的定义吻合,否则到递推公式的时候就会越来越乱。

⾸先从dp[i][j]的定义出发,如果背包容量j为0的话,即dp[i][0],⽆论是选取哪些物品,背包

价值总和⼀定为0。如图:

在看其他情况。

状态转移⽅程 dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出i 是由 i-1推导出来,那么i为0的时候就⼀定要初始化。

dp[0][j],即:i为0,存放编号0的物品的时候,各个容量的背包所能存放的最⼤价值。

那么很明显当 j < weight[0]的时候,dp[0][j] 应该是 0,因为背包容量⽐编号0的物品重量还

⼩。

当j >= weight[0]是,dp[0][j] 应该是value[0],因为背包容量放⾜够放编号0物品。

代码初始化如下:

// 当然这⼀步,如果把dp数组预先初始化为0了,这⼀步就可以省略,但很多同学应该没有想清楚这⼀点。
for (int j = 0 ; j < weight[0]; j++) dp[0][j] = 0;

// 正序遍历
for (int j = weight[0]; j <= bagWeight; j++)  dp[0][j] = value[0];

此时dp数组初始化情况如图所⽰:

其实从递归公式: dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]); 可以看出dp[i][j] 是由左上⽅数值推导出来的,那么 其他下标初始为什么数值都可以,因为都会被覆盖。但只不过⼀开始就统⼀把dp数组统⼀初始为0,更⽅便⼀些。

(4)确定遍历顺序

在如下图中,可以看出,有两个遍历的维度:物品与背包重量

那么问题来了,先遍历物品还是先遍历背包重量呢?

其实都可以!! 但是先遍历物品更好理解。

先遍历物品,然后遍历背包重量的代码:

// weight数组的⼤⼩ 就是物品个数
// 遍历物品
for(int i = 1; i < weight.size(); i++) 
{   // 遍历背包容量
    for(int j = 0; j <= bagWeight; j++) 
    { 
       if (j < weight[i]) dp[i][j] = dp[i - 1][j]; // 这个是为了展现dp数组⾥元素的变化
       else dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
    }
}

先遍历背包,再遍历物品,也是可以的!(注意我这⾥使⽤的⼆维dp数组)

2、代码:

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

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

相关文章

14、ThingsBoard-自定义华为云SMS规则节点

1、概述 一个物联网平台承载着很多设备的连接,当设备出现异常的时候,能够快速的通知到运维管理员是非常重要的,thingsboard提供了自定义配置邮箱,但是它对支持发送短信的不是很友好,都是国外的sms服务商,我反正是不用那个,在国内常见就是阿里、腾讯、华为、七牛常用的s…

【Python百日进阶-数据分析】Day224 - plotly漏斗图px.funnel()

文章目录一、语法二、参数三、返回值四、实例4.1 使用 plotly.express 的漏斗图4.1.1 基本漏斗图4.1.2 堆积漏斗图4.1.3 基本区域漏斗图4.2 使用 plotly.graph_objects 的漏斗图4.2.1 基本漏斗图4.2.2 设置标记大小和颜色4.2.3 堆积漏斗图4.2.4 基本区域漏斗图4.2.5 在区域漏斗…

Postgresql遇到的问题

解决问题之前最好先下载个pgadmin可视化工具&#xff0c;下面可能要用到。先看图&#xff0c;了解基本的\n 代表是当前数据库下面schemas的文件\du 代表你有这写用户&#xff08;角色&#xff09;&#xff0c;后面代表的权限\l 代表的是你的数据库在敲命令之前你德先进去docker…

excel表格技巧:Ctrl+T在超级表中的妙用

在介绍超级表的其它奇妙功能之前&#xff0c;小编先给大家说一个在创建超级表时应该注意的小细节。在创建超级表的对话框里&#xff0c;有一个“表包含标题”的选项&#xff0c;大家一定要记得勾选哦&#xff0c;不然超级表就会变成下面这样&#xff1a;超级表会自作聪明的在表…

【ROS】package.xml文件解析

文章目录 文章目录 前言 一、基本格式 1.基本结构 2.必要标签 3.依赖关系 二、Metapackage包 总结 前言 ros每个功能包中都有一个包清单&#xff0c;它是一个名为package.xml的XML 文件&#xff0c;它必须包含在任何符合 catkin 的包的根文件夹中。此文件定义有关包的属…

Vue过滤器

Vue过滤器1. 概述2. 全局过滤器与局部过滤器2.1 过滤器参数2.2 过滤器的串联1. 概述 在Vue.js中&#xff0c;过滤器主要用于文本的格式化&#xff0c;或者组件数据的过滤与排序等。从Vue2.0.0版本开始&#xff0c;内置的过滤器已经被删除&#xff0c;需要自己编写。 2. 全局过…

【OpenGL学习】绘制三角形

绘制三角形 上节中完成了窗口的绘制&#xff0c;这节我们主要实现在窗口中完成一个最简单的三角形的绘制&#xff0c;同样&#xff0c;要完成一个三角形的绘制&#xff0c;需要以下内容&#xff1a; Vertex Array 存放顶点数据的数组&#xff08;实际上存放的是顶点数据的指针…

Imagination与Synopsys携手加快移动端与数据中心3D可视化技术的发展

IMG CXT GPU与Synopsys Fusion QIK一同优化移动光追应用的PPA中国北京 - 2023年1月13日- Imagination Technologies与领先的电子设计自动化&#xff08;EDA&#xff09;解决方案和服务商Synopsys一起为移动光追解决方案打造一个更加快速、高效的设计流程。光追技术通过模仿光线…

1.1、操作系统的概念、功能和目标

整体框架 1、操作系统的层次结构 对于操作系统&#xff1a; 负责管理协调硬件、软件登计算机资源的工作为上层的应用程序、用户提供简单易用的服务操作系统是系统软件&#xff0c;而不是硬件 对于裸机&#xff08;纯硬件&#xff09;&#xff1a; 例如&#xff1a;CPU、内存…

2023年音视频开发前景如何?音视频开发需要掌握哪些技术?

引言 音视频开发这一行业其实已经出现了有些年头了&#xff0c;但为什么现在就突然火爆了起来呢&#xff1f;实则就是两个字&#xff0c;需求&#xff1b;在这两年中&#xff0c;人们将工作、生活、学习相关的作业都其变成线上化&#xff0c;所以短视频、超高清视频和实时音视频…

【C++】STL容器:list的模拟实现

一、list的结构 1. list的节点 list的底层是一个带头双向循环链表&#xff0c;但list本身和list的节点是不同的结构&#xff0c;需要分开实现。 list节点的结构&#xff1a; template<class T> struct list_node {list_node<T>* _next;list_node<T>* _pre…

ELK日志(4)

搭建filebeatredislogstasheskibana架构&#xff0c;拓扑图参考ELK&#xff08;3&#xff09;安装redis&#xff0c;并启动&#xff08;1&#xff09;准备安装和数据目录[rootes ~]# mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid}&#xff08;2&#xff09;下载redi…

CES 2023:推动低碳化与数字化,英飞凌塑造可持续未来

在参展CES 2023的3200多家企业当中&#xff0c;英飞凌虽然在规模上还比不上某些国际科技巨头&#xff0c;但是其展示的内容却相当引人瞩目。作为一家创立于1999年的高科技企业&#xff0c;英飞凌在全球总计拥有56个研发机构&#xff0c;20个生产工厂&#xff0c;其技术实力之雄…

fiddler 抓手机的包

目录 一、fiddler抓手机包的介绍 二、一个前提&#xff0c;及配置 1.前提 2.前提配置 三、两大步 1.设置fiddler 2.设置手机 一、fiddler抓手机包的介绍 Fiddler是一款非常流行并且实用的http抓包工具&#xff0c;它的原理是在本机开启了一个http的代理服务器&#xff…

分享111个JavaScript源码,总有一款适合您

JavaScript源码 分享111个JavaScript源码&#xff0c;总有一款适合您 源码下载链接&#xff1a;https://pan.baidu.com/s/1aUIpouX5nTwW1FF-8lStnw?pwdjh3v 提取码&#xff1a;jh3v 采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 ​ 下面是文件的名字&#xff0c;我放…

Golang Web Application

Golang Web Application GoLang Web App基本设置 1.导入库 导入fmt和net/http,http建立一个/和编写一个indexPage的函数,fmt编写一个写Hello world! package mainimport ("fmt""net/http" )func main() {http.HandleFunc("/", indexPage)http.L…

[数据结构复习]自用大纲

内容多基于王道和李春葆《数据结构教程》&#xff0c;做复习提纲之用 基本内容回顾 顺序队 队列是线性表&#xff08;具有逻辑上的前驱后继关系&#xff09;。头插尾删&#xff0c;先进先出。 队列的实现至少需要维护如下内容&#xff08;一数组&#xff0c;二指针&#xff…

电脑开机屏幕闪烁后变成蓝屏无法启动怎么办?

电脑开机屏幕闪烁后变成蓝屏无法启动怎么办&#xff1f;有用户在将电脑开机之后&#xff0c;出现了屏幕会闪动的情况&#xff0c;接着电脑屏幕就变成蓝屏的了。而且再次启动的时候也是这样。这个情况下是我们的系统出现了问题&#xff0c;我们来看看如何去使用U盘进行系统重装的…

python+django大学生体质测试管理系统

系统分为学生和管理员&#xff0c;教师三个角色 学生的主要功能有&#xff1a; 1.学生注册和登陆系统 2.查看系统的公告资讯信息 3.学生查看体质测试的项目&#xff0c;下载测试文件 4.学生留言板在线留言 5.学生个人中心修改个人资料&#xff0c;修改密码 6.学生个人中心查询我…

Java 介绍与环境搭建

文章目录Java 介绍与环境搭建Java 背景介绍Java 背景故事Java 三大平台Java SEJava MEJava EEJava 跨平台工作原理平台与跨平台跨平台工作原理JDK 下载和安装下载 JDK安装 JDK第一个 Java 程序HelloWorld 介绍Java 程序开发的三个步骤HelloWorld 案例的编写和运行HelloWord 案例…