[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背包及其优化详解相关推荐

  1. 01背包经典例题详解

    转载自点击打开链接 首先01背包题目的雏形是 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 从这个题目中可以看出,01背包的特点 ...

  2. 优化算法中的零次优化详解

    零次优化公式算法收敛 无梯度优化 minf(x)minf(x)minf(x) 无梯度方法适用于梯度难以得到.获得昂贵 传统无梯度方法: 基于直接搜索的方法:坐标搜索,广义模式搜索和网格自适应直接搜索 ...

  3. matlab中gad,10大经典算法matlab代码以及代码详解【数学建模、信号处理】

    [实例简介] 10大算法程序以及详细解释,包括模拟退火,禁忌搜索,遗传算法,神经网络.搜索算法. 图论. 遗传退火法.组合算法.免疫算法. 蒙特卡洛.灰色预测.动态规划等常用经典算法.是数学建模.信号 ...

  4. lucene.NET详细使用与优化详解

    lucene.NET详细使用与优化详解 http://www.cnblogs.com/qq4004229/archive/2010/05/21/1741025.html http://www.shan ...

  5. 高效并发:Synchornized的锁优化详解

    高效并发:Synchornized的锁优化详解 1. HotSpot虚拟机的对象头的内存布局 2. 偏向锁 举一反三:当锁进入偏向状态时,存储hash码的位置被覆盖了,那对象的hash码存储到哪儿的? ...

  6. 快速排序深度优化详解

    正如它的名字所体现,快速排序是在实践中最快的已知排序算法,平均运行时间为O(NlogN),最坏的运行时间为O(N^2).算法的基本思想很简单,然而想要写出一个高效的快速排序算法并不是那么简单.基准的选 ...

  7. WINDOWS XP服务和进程优化详解

    WINDOWS XP服务和进程优化详解 1.Alerter Alerter(警示器)服务的进程名是Services.exe(即启动这个服务后在后台运行的进程的名称,可以通过任务管理器看到).Alert ...

  8. EMD算法之Hilbert-Huang Transform原理详解和案例分析

    目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...

  9. MySQL之SQL优化详解(二)

    目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析 ...

最新文章

  1. FTP同步的另类解决办法——NetDrive
  2. 从TXT文本文档向Sql Server中批量导入数据
  3. robotframework ie浏览器中click button不可用_RobotFramework自动化Selenium2Library库常用关键字...
  4. Android真机调试打印日志的方法
  5. tomcat默认用户名密码修改
  6. 【计算机系统设计】实践笔记(4)改进数据通路:第一类I型指令分析与实现
  7. 【LeetCode笔记】19.删除链表的倒数第N个结点(Java、快慢指针)
  8. 小升初想择校,英语跟语数一样重要吗?
  9. for 循环 与forEach 里面return 的区别
  10. matlab中普通电感,matlab电感在哪
  11. 【vue网站优化】秒开网页
  12. 曲子龙:相比其它诈骗,区块链ICO到底牛在哪?
  13. 区块链技术在旅游业中的应用探索
  14. 什么是GEMM?该怎么去学习GEMM?
  15. 镭速传输攻克视频素材传输顽疾,大幅提升业务效率
  16. KiBiEx互联网交易互动平台数字货币
  17. STM32 CubeMX如何生成微秒(us)级延时
  18. idea实用与炫酷的插件推荐
  19. java基于Android校园购物商城小超市
  20. [高数]2023武忠祥第四章例12

热门文章

  1. 生命与负熵---宇宙的心弦
  2. 【题解】CF#855 G-Harry Vs Voldemort
  3. 单片机模拟iic从设备-主要代码(2)
  4. Spring Boot 2.2.x Junit4 升级为Junit5 后的变化、对比 找不到 org.junit.jupiter.api.Test
  5. [转载]徐文兵:梦与健康
  6. 数理统计复习笔记七——列联表的独立性检验
  7. CSS 网格 Gird 布局
  8. java 编码填充 word 模板生成 word合同,并将word合同转成pdf 文档
  9. JAVA stream流详细教程
  10. 2021-09-30 cannot locate default realm