【算法】01背包及其优化详解
[01背包]
一、问题描述:
在NNN个物品,背包容量为CCC的情况下,每个物品的价值为viv_ivi,重量为wiw_iwi,每个物品选择装入背包(1)或者选择不装入背包(0)。然后选择物品装入背包使得背包的总价值最大。
二、状态表示及其转换
f[i][j]
表示前iii件物品,背包容量为jjj的情况下的最大价值
故f[0][0~C]
就是什么物品都没选,背包容量为0~C的情况下的最大价值,故而为0。
f[i][j]
由两种状态转为过来,
①选第iii件物品f[i][j] = f[i-1][j - v[i]] + w[i]
f[i-1][j-v[i]]
表示在没选(或者是选不了)第iii件物品时,需要预留v[i]v[i]v[i]的容量
②不选第iii件物品f[i][j] = f[i-1][j]
三、实例
问题:
有 4 件物品和一个容量为 5 的背包。每件物品只能使用一次。
问:
将哪些物品装入背包,可使这些物品的总体积不超过背包容量且总价值最大
①初始状态下:
②状态转移过程中:
③最终情况:
f[4][5]
即为在容量为5,前4件物品的情况下背包的最大价值。也是这道题的最大价值。
代码
#include <iostream>
using namespace std;
#define N 1005
int v[N]; // 体积
int w[N]; // 价值
int f[N][N]; // 容积为N,前N件物品的最大价值
int n, m;int main() {cin >> n >> m;for(int i = 1;i <= n; i ++) cin >> v[i] >> w[i];for(int i = 1;i <= n; i ++)for(int j = 1;j <= m; j ++) {if(j < v[i]) f[i][j] = f[i - 1][j]; // j容量装不下第i件物品else f[i][j] = max(f[i - 1][j], f[i - 1][j - v[i]] + w[i]); // 比较选还是不选,选大的替换}cout << f[n][m] << endl;return 0;
}
空间复杂度优化
先上代码
#include <iostream>
using namespace std;
#define N 1005int v[N]; // 体积
int w[N]; // 价值
int f[N]; // 容积为N的最大价值
int n, m;int main() {cin >> n >> m;for(int i = 1;i <= n; i ++) cin >> v[i] >> w[i];for(int i = 1;i <= n; i ++)for(int j = m;j >= v[i]; j --)f[j] = max(f[j], f[j - v[i]] + w[i]); // 比较选还是不选,选大的替换cout << f[m] << endl;return 0;
}
在上面的二维背包中,f[i][j]的状态总是与i-1有关,所以我们没有必要开一个二维数组。
如下图3那行中的状态总是由2那行的状态转换过来的。以及我们可以观察到一个点,总是由**左上角和上面**转移过来的。这也是为什么把维度缩小成一维之后代码从m开始,逆序开始遍历。 逆序开始遍历不会影响改变的`f[i]`不会对后面进行影响。因为状态的转移我们可以想象成是从左上角和上面转移过来的。 如果是从1开始顺序遍历,就会出现后面的`f[i]`使用的不是`"f[i-1]"`转移过来的。从1开始遍历的时候更改`f[i]`的时候后面用的`f[i]`都是这一轮的也就是`"f[i]"`状态的值。
【算法】01背包及其优化详解相关推荐
- 01背包经典例题详解
转载自点击打开链接 首先01背包题目的雏形是 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 从这个题目中可以看出,01背包的特点 ...
- 优化算法中的零次优化详解
零次优化公式算法收敛 无梯度优化 minf(x)minf(x)minf(x) 无梯度方法适用于梯度难以得到.获得昂贵 传统无梯度方法: 基于直接搜索的方法:坐标搜索,广义模式搜索和网格自适应直接搜索 ...
- matlab中gad,10大经典算法matlab代码以及代码详解【数学建模、信号处理】
[实例简介] 10大算法程序以及详细解释,包括模拟退火,禁忌搜索,遗传算法,神经网络.搜索算法. 图论. 遗传退火法.组合算法.免疫算法. 蒙特卡洛.灰色预测.动态规划等常用经典算法.是数学建模.信号 ...
- lucene.NET详细使用与优化详解
lucene.NET详细使用与优化详解 http://www.cnblogs.com/qq4004229/archive/2010/05/21/1741025.html http://www.shan ...
- 高效并发:Synchornized的锁优化详解
高效并发:Synchornized的锁优化详解 1. HotSpot虚拟机的对象头的内存布局 2. 偏向锁 举一反三:当锁进入偏向状态时,存储hash码的位置被覆盖了,那对象的hash码存储到哪儿的? ...
- 快速排序深度优化详解
正如它的名字所体现,快速排序是在实践中最快的已知排序算法,平均运行时间为O(NlogN),最坏的运行时间为O(N^2).算法的基本思想很简单,然而想要写出一个高效的快速排序算法并不是那么简单.基准的选 ...
- WINDOWS XP服务和进程优化详解
WINDOWS XP服务和进程优化详解 1.Alerter Alerter(警示器)服务的进程名是Services.exe(即启动这个服务后在后台运行的进程的名称,可以通过任务管理器看到).Alert ...
- EMD算法之Hilbert-Huang Transform原理详解和案例分析
目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...
- MySQL之SQL优化详解(二)
目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...
最新文章
- FTP同步的另类解决办法——NetDrive
- 从TXT文本文档向Sql Server中批量导入数据
- robotframework ie浏览器中click button不可用_RobotFramework自动化Selenium2Library库常用关键字...
- Android真机调试打印日志的方法
- tomcat默认用户名密码修改
- 【计算机系统设计】实践笔记(4)改进数据通路:第一类I型指令分析与实现
- 【LeetCode笔记】19.删除链表的倒数第N个结点(Java、快慢指针)
- 小升初想择校,英语跟语数一样重要吗?
- for 循环 与forEach 里面return 的区别
- matlab中普通电感,matlab电感在哪
- 【vue网站优化】秒开网页
- 曲子龙:相比其它诈骗,区块链ICO到底牛在哪?
- 区块链技术在旅游业中的应用探索
- 什么是GEMM?该怎么去学习GEMM?
- 镭速传输攻克视频素材传输顽疾,大幅提升业务效率
- KiBiEx互联网交易互动平台数字货币
- STM32 CubeMX如何生成微秒(us)级延时
- idea实用与炫酷的插件推荐
- java基于Android校园购物商城小超市
- [高数]2023武忠祥第四章例12
热门文章
- 生命与负熵---宇宙的心弦
- 【题解】CF#855 G-Harry Vs Voldemort
- 单片机模拟iic从设备-主要代码(2)
- Spring Boot 2.2.x Junit4 升级为Junit5 后的变化、对比 找不到 org.junit.jupiter.api.Test
- [转载]徐文兵:梦与健康
- 数理统计复习笔记七——列联表的独立性检验
- CSS 网格 Gird 布局
- java 编码填充 word 模板生成 word合同,并将word合同转成pdf 文档
- JAVA stream流详细教程
- 2021-09-30 cannot locate default realm