动态规划--01背包问题

news2024/11/14 2:11:36

01背包问题

  • 背包问题
    • 题目
    • 最优解结构性质
    • 状态转移方程
      • 方程
      • 理解
    • 递归实现
      • 核心思想
      • 代码实现
      • 用例测试
    • 画表非递归实现
      • 核心思路
      • 代码实现
      • 画表展示
    • 计算哪些物品放入
      • 算法思想
      • 代码实现

背包问题

题目

0-1背包问题:给定n种物品和一背包。物品à的重量是w;,其价值为v; ,背包的容量为C。问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?

最优解结构性质

W[n]={w1,w2,...wn};//重量数组
V[n]={v1,v2,...vn};//价值数组
X[n]={x1,x2,...xn};//结果数组

该问题可以总结为该数学公式

SUM(wi*xi)<=C 
&&
MAX(SUM(vi*xi));

在选择装入背包的物品时,对每种物品i只有两种选择,即装入背包或不装人背包。不能将物品i装入背包多次,也不能只装人部分的物品i。因此,该问题称为0-1背包问题,分析时,还是用分治策略,缩小规模,从后面砍数据,将最后一个物品去除

SUM(wi*xi)<=C-wn-1;i=1,2,..n-1;
 &&
MAX(SUM(vi*xi));i=1,2,..n-1;

用m[i][j]来表示当装了i个物品后,背包剩余的空间大小为j时,此时背包中物品的最大价值

注意: i不是一个点值,而是一个区域值,从 0 1 …到i

状态转移方程

方程

  • i==1时
    • m[1][j]=j>w[1]?v[1]:0
  • i>1时,考虑是否能放下,考虑放不放两种选择,
    • 放不下的话
      • m[i][j]=m[i-1][j]
    • 能放下考虑最大值
      • m[i][j]=max(m[i-1][j],m[i-1][j-w[i]]+v[i])

理解

当只有一个物品时,看能不能放下,能放下,就有价值,否则价值为0
多个物品时,看第i个物品能否放下,取决于背包的剩余容量,
**如果放不下,**价值就和i-1时一样,
**能放下,**要考虑放不放,放的话,价值增加,但是就占了空间,可能导致后面性价比高的东西放不下了,所以此时需要取最大值

不放入背包时:第i次决策后的最大价值和第i-1次决策时候的价值是一样的还是原来的那些物体,没多没少。
放入背包时:第i次决策后的价值为 第i-1次决策时候的价值 加上 当前物体的价值v[j]。物体放入背包前背包容量变为 j ,放入后,容量就会变小j-w[i],即此时价值为前一个物品放入时,剩余容量为j-w[i]时的价值

递归实现

核心思想

刚开始物品比较多,每次都依赖于前面的价值,每次都在缩小规模,等缩小到底部时,再依次回溯,得出结果

代码实现

int Knapsance(int* V, int* W, int i, int n,int j) {
	if (i == 1) {
		if (j >= W[i]) return V[i];
		else return 0;
	}
	else {
		if (j < W[i]) {
			return Knapsance(V, W, i - 1, n, j);
		}
		else {
			int v1 = Knapsance(V, W, i - 1, n, j);
			int v2 = Knapsance(V, W, i - 1, n, j - W[i]) + V[i];
			if (v1 > v2)return v1;
			else return v2;
		}
	}
}

用例测试

int main() {
	const int n = 5;
	const int c = 10;
	int W[n + 1] = { 0,2,2,6,5,4 };
	int V[n + 1] = { 0,6,3,5,4,6 };
	vector<vector<int> >m(n + 1, vector<int>(c + 1, 0));
	int maxv = Knapsance(V, W, n,n , c);
	cout << maxv;
	return 0;
}

输出结果为15

画表非递归实现

核心思路

从底部向上记录,根据动归表达式,自底向上记录。先初始化第一行第一列,然后根据动归表达式依次填写。
int W[n + 1] = { 0,2,2,6,5,4 };
0 1 2 3 4 5
int V[n + 1] = { 0,6,3,5,4,6 };

代码实现

int NiceKnapsance2(int* V, int* W, int n, int c, vector<vector<int> >& m) {
	for (int j = 1; j <= c; j++) {
		m[1][j] = j > W[1] ? V[1] : 0;
	}
	PrintVector(m);
	for (int i = 1; i<=n; i++) {
		for (int j = 1; j <= c; j++) {
			if (j < W[i]) {
				m[i][j] = m[i - 1][j];
			}
			else {
				m[i][j] = std::max(m[i - 1][j], m[i - 1][j - W[i]] + V[i]);
			}
		}
		PrintVector(m);
	}
	return m[n][c];
}

画表展示

在这里插入图片描述

计算哪些物品放入

算法思想

根据画的表,进行回溯,标记求解

代码实现

void Traceback(vector<vector<int>>& m, int W[], int n, int c, bool X[]) {
	for (int i = n; i >= 1; i--) {
		if (m[i][c] != m[i-1][c]) {
			X[i] = true;
			c = c - W[i];
		}
	}
}

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

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

相关文章

科普文:国内ChatGPT怎么用,ChatGPT国内怎么用,关于ChatGPT你需要了解的内容应该都在这

在国内用了很长一段时间的ChatGPT&#xff0c;每次跟小白&#xff0c;哪怕是用ChatGPT的人交流的时候&#xff0c;都感觉解释不清&#xff0c;正好今天周末&#xff0c;给大家整理一篇关于ChatGPT的科普文&#xff0c;想要了解或使用ChatGPT的人&#xff0c;一定要看~~~&#x…

html实现经典赛车小游戏

文章目录 1.设计来源1.1 主界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/130580123 html实现经典赛车小游戏源码 html实现经典赛车小游戏源码&#xff0c;1.通过键盘…

如何让flex布局中的一个子元素单独右侧对齐

flex布局中的一个子元素单独右侧对齐 在 Flex布局中&#xff0c;我们经常需要对子元素进行对齐操作。使用 justify-content 和 align-items 可以轻松地对所有子元素进行对齐&#xff0c;但是当我们需要对某个子元素进行单独的对齐时&#xff0c;我们应该怎么做呢&#xff1f; …

【涨知识】PCB板为什么多是绿色的?

拿到一块PCB板时&#xff0c;最直观看到板子上油墨的颜色&#xff0c;就是我们一般指的PCB板颜色。PCB板的颜色多种多样&#xff0c;包括绿色、蓝色、红色和黑色等。 其中&#xff0c;绿色是最常用的&#xff0c;更为大家所熟悉。但为什么PCB板多是绿色呢? 当中缘由&#xff…

exe4j打包Jar成exe文件

1. 进入exe4j官网下载exe4j&#xff0c;安装到自己电脑上。 安装完后运行此软件 2. 在自己电脑上新建一个文件夹&#xff08;名字随便起&#xff09;&#xff0c;文件夹内放入要转换的jar文件&#xff0c;ico格式的图片&#xff0c;jar文件夹&#xff08;含jar文件&#xff09…

fbx sdk的使用介绍

我们平时需要围绕fbx写一些小工具&#xff0c;虽说使用ascii格式的fbx可以直接进行字符串解析&#xff0c;并且网上也有一些基于ascii解析的开源库&#xff0c;但在制作一些通用的工具时&#xff0c;使用fbx sdk进行编写肯定是最好的。 1.下载fbx sdk和cmake 要用cmake生成vi…

Revit:测量自适应点之间的距离和轴网距离标注

一、如何测量自适应点之间的距离 今天在体量中发现怎么用对齐标注测量两个自适应点的距离不正确&#xff0c;只用肉眼来看也是错的。 自适应点时空间中的点&#xff0c;直接测量两个点并不能保证测量的时两个点之间的最短距离&#xff0c;有可能时如图所示我们的空间中测量的并…

初始Redis以及Redis的安装

目录 1.初识Redis 1.1.认识NoSQL 1.1.1.结构化与非结构化 1.1.2.关联和非关联 1.1.3.查询方式 1.1.4.事务 1.1.5.总结 1.2.认识Redis 1.3.安装Redis 1.3.1.依赖库 1.3.2.上传安装包并解压 1.3.3.启动 1.3.4.默认启动 1.3.5.指定配置启动 1.3.6.开机自启 1.初识Re…

(八) 探究基于TCP连接的即时通信系统文件功能的实现

文章目录 一、引言二、实现用户文件功能2.1 打开文件并读取相关信息2.2 实现文件的发送和接收2.3 实现文件的展示和管理 三、代码展示3.1 客户端的关键代码 四、效果展示五、个人经验分享六、如何进一步优化文件功能七、总结 一、引言 即时通信系统的用户文件功能是一项非常重…

JVM Shutdown Hook 机制原理以及源码分析

写在前面 最近看众多框架源码的时候都看到使用到了Shutdown Hook机制。比如下图&#xff1a;SkyWalking、Spring、Tomcat等等框架&#xff0c;几乎只要是Java层面的框架都会使用到此机制。所以&#xff0c;借用论坛给读者写一篇关于JVM Shutdown Hook 机制原理分析以及源码分析…

PS如何安装ZXP扩展插件?

Photoshop如何安装ZXP扩展插件&#xff1f;有些小伙伴不会安装&#xff0c;本文介绍两种安装ZXP扩展的方法&#xff0c;希望对您有帮助。 方法一&#xff1a;手动安装方式 1、把下载好的.zxp扩展名改为.zip&#xff0c;然后解压。 Windows系统&#xff1a;C:\Users[ USER ]\A…

CSS--定位

01-定位 作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 1.定位模式&#xff1a;position 2.边偏移&#xff1a;设置盒子的位置 leftrighttopbottom 相对定位 position: relative 特点&#xff1a; 不脱标&#xff0c;占用自己原来位置显示模式特点保…

系统安全分析与设计

目录 第五章、系统安全分析与设计1、信息系统安全属性2、对称加密技术与非对称加密技术3、信息摘要4、数字签名5、数字信封与PGP6、网络安全6.1、各个网络层次的安全保障6.2、网络威胁与攻击6.3、防火墙 第五章、系统安全分析与设计 1、信息系统安全属性 安全属性 保密性&…

最近想学PMP,有什么要注意和推荐的吗?

我觉得参加PMP的学习和考试有两点需要把握住&#xff0c;一是心态&#xff0c;二是学习方法&#xff1b; 谈心态的话虽然比较虚&#xff0c;因为这个还是要看个人在生活中对事物发展的应对能力与应对突发情况的处理能力&#xff0c;但是简单的谈谈在备考过程中心态的处理还是很…

Docker私有仓库

Docker私有仓库 私有仓库搭建 首先启动docker 拉取私有仓库镜像 [rootserver-a ~]# docker pull registry Using default tag: latest latest: Pulling from library/registry 79e9f2f55bf5: Pull complete 0d96da54f60b: Pull complete 5b27040df4a2: Pull complete e2ead82…

「PDF转长图」无压力:两种简单易学的转换方法!

在加班赶DDL的晚上&#xff0c;你突然接到老板的信息&#xff1a;立刻将这份PDF文件转换成长图并发给我&#xff01;于是你开始了疯狂截图的模式。你是否曾经遇到过这个问题&#xff0c;不知道是否有方便快捷的PDF转长图的解决方法呢&#xff1f; 作为一名资深的PDF专家&#x…

【26】核心易中期刊推荐——机器智能人工神经网络

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

诗圣杜甫不同时期的代表作

杜甫一生大致分为四个时期。 中青年时期 青年时&#xff0c;作为官三代的杜甫并不缺钱&#xff0c;四处游历&#xff0c;与李白、高适唱和、仙游&#xff0c;成为佳话。这个时期杜甫的作品热血豪迈&#xff0c;气势蓬勃。代表作首推《望岳》&#xff1a; 岱宗夫如何&#xf…

TCP三次握手,四次挥手

为什么是三次握手&#xff0c;两次or四次为什么不行&#xff1f; 两次握手&#xff1a;客户端发&#xff0c;服务收到后发&#xff0c;两方即可建立连接 存在的问题&#xff1a;这个过程确认了客户端发送能力正常&#xff0c;服务端发送&#xff0c;接受能力正常&#xff0c;…

商户查询的缓存——添加redis缓存

1.什么是缓存 缓存就是数据交换的缓冲区&#xff08;Cache&#xff09;,是存储数据的临时地方&#xff0c;一般读写性能较高 2.添加redis缓存 Autowired private StringRedisTemplate stringRedisTemplate; /*** 通过id查询商户信息* param id* return*/ Override public Resu…