对背包dp的再探究:以 采药 和 疯狂的采药 为例
题目链接:
01背包:采药
完全背包:疯狂的采药
关于 "总体积刚好是 V " 和 ”总体积 \(\le\) V “
正常的背包推导的都是 ”总体积刚好是 V “。这一点很重要,而且大部分题问的都是这种。
而 ”总体积 \(\le\) V “,只需要求一发前缀 \(\min\) 即可。两道例题就是这种情况,特此写下。
F(i, 0, vmax) ans = max(ans, f[n][i]);
01背包
两种写法:
记 \(f[i][j]\) 表示前 \(i\) 个物品,总体积强制为 \(j\) 的最大价值。
F(i, 1, n){
F(j, 0, vmax){
if(j < a[i]) f[i][j] = f[i - 1][j];
else f[i][j] = max(f[i - 1][j], f[i - 1][j - a[i]] + b[i]);
}
}
记 \(f[j]\) 表示当前考虑了前 \(i\) 个物品,总体积强制为 \(j\) 的最大价值。
F(i, 1, n){
G(j, vmax, a[i]){
f[j] = max(f[j], f[j - a[i]] + b[i]);
}
}
思考1:为什么可以省掉物品这一维?
首先,我们只关注 \(f[i - 1][0 \sim j]\) 和 \(f[i][0 \sim j]\) 的状态。(这也是滚动数组的依据)
那么,我们可以用 \(f[0 \sim j]\) 更新前 和 更新后的状态分别表示 \(f[i - 1]\) 和 \(f[i]\)。
思考2:为什么一维写法要倒着枚举体积?
- 一维写法:由于 每个物品最多选一次,因此,如果正着枚举体积,那么(根据思考1)更小的 \(j\) 已是更新后的 状态,这样再来更新当前的 \(f[j]\), 一件物品可能会被重复选择,是有问题的。
完全背包
记 \(f[i][j]\) 表示前 \(i\) 个物品,总体积强制为 \(j\) 的最大价值。
F(i, 1, n){
F(j, 0, vmax){
if(j < a[i]) f[i & 1][j] = f[(i - 1) & 1][j];
else f[i & 1][j] = max(f[(i - 1) & 1][j], f[i & 1][j - a[i]] + b[i]);
}
}
记 \(f[j]\) 表示当前考虑了前 \(i\) 个物品,总体积强制为 \(j\) 的最大价值。
F(i, 1, n){
F(j, a[i], vmax){
f[j] = max(f[j], f[j - a[i]] + b[i]);
}
}
思考3:为什么完全背包是正着枚举的?
- 因为一件物品可以被选择无数次。
思考4:两种背包的二维写法有何不同?为什么?
- 01背包是从 \(f[i - 1][j - a[i]]\) 转移来的,而完全背包是从 \(f[i][j - a[i]]\) 转移过来的。因为 \(f[i - 1]\) 始终是 一件当前物品都还没选到 的状态。
对背包dp的再探究:以 采药 和 疯狂的采药 为例的更多相关文章
- [USACO Section 5.3]量取牛奶 Milk Measuring (动态规划,背包$dp$)
题目链接 Solution 完全背包 \(dp\) , 同时再加一个数组 \(v[i][j]\) 记录当总和为\(j\) 时第 \(i\) 种物品是否被选. 为保证从小到大和字典序,先将瓶子按大小排序 ...
- 复习1背包dp
背包问题是对于一个有限制的容器,一般计算可以装的物品的价值最值或数量.通常每个物品都有两个属性空间和价值,有时还有数量或别的限制条件,这个因体而异. 背包大概分成3部分,下面会细述这最经典的3种题型 ...
- HDU 1011 树形背包(DP) Starship Troopers
题目链接: HDU 1011 树形背包(DP) Starship Troopers 题意: 地图中有一些房间, 每个房间有一定的bugs和得到brains的可能性值, 一个人带领m支军队从入口(房 ...
- bzoj5281/luogu4377 Talent Show (01分数规划+背包dp)
就是01分数规划的思路,只不过当把w[i]-r*t[i]>0的选完以后如果w值还没达到要求,那就再01背包dp一下就好了(dp时w值>W的时候就存在W里就不会爆内存了). (跑得很慢..大 ...
- 【LibreOJ】#6395. 「THUPC2018」城市地铁规划 / City 背包DP+Prufer序
[题目]#6395. 「THUPC2018」城市地铁规划 / City [题意]给定n个点要求构造一棵树,每个点的价值是一个关于点度的k次多项式,系数均为给定的\(a_0,...a_k\),求最大价值 ...
- UOJ #17. 【NOIP2014】飞扬的小鸟 背包DP
#17. [NOIP2014]飞扬的小鸟 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4902 Solved: 1879 题目连接 http:// ...
- 【bzoj4987】Tree 树形背包dp
题目描述 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. 输入 第一行两个正整数n,k,表示数的顶点数和需要选出的点个数. 接下 ...
- 【bzoj2427】[HAOI2010]软件安装 Tarjan+树形背包dp
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大).但是现 ...
- 算法复习——背包dp
1.01背包 二维递推式子: 代码: ;i<=n;i++) ;x--) ][x-w[i]]+c[i],f[i-][x]); ][x]; printf("%d",f[n][m] ...
- 背包DP HDOJ 5410 CRB and His Birthday
题目传送门 题意:有n个商店,有m金钱,一个商店买x件商品需要x*w[i]的金钱,得到a[i] * x + b[i]件商品(x > 0),问最多能买到多少件商品 01背包+完全背包:首先x == ...
随机推荐
- RabbitMq高级特性之延迟队列 通俗易懂 超详细 【内含案例】
RabbitMq高级特性之延迟队列 介绍 消息进入队列后不能立即被消费,到达指定时间后才可被消费 实现 结合以下两种即可达到延迟队列 RabbitMq高级特性之TTL过期时间 RabbitMq高级特性 ...
- 屏蔽RaiDrive的广告
RaiDrive 广告域名:ads.raidrive.com 在 HOSTS 添加 127.0.0.1 ads.raidrive.com 或者在代理中设置为阻止即可. 效果: 补 最新版(2023.9 ...
- C语言实现url解析小实例
一.前言 前面一口君写了一篇关于url的文章: <一文带你理解URI 和 URL 有什么区别?> 本篇在此基础上,编写一个简单的用于解析url的小例子, 最终目标是解析出URL中所有的数据 ...
- 【CMake系列】10-cmake测试 ctest
cmake作为一个强大的构建系统指导工具,同时也提供了测试功能,可用于项目的单元测试等,也可以与其他测试框架协作,如googletest,共同完成项目开发中的测试工作,本节我们就来学习 如何借助cma ...
- 不是 PHP 不行了,而是 MySQL 数据库扛不住啊
大家好,我是码农先森. 大多数的业务场景下 PHP 还没有达到性能瓶颈,然而 MySQL 数据库就先行驾崩了.但我们总是不分青红皂白,一股脑的把原因归结于是 PHP 语言不行了,每当遇到这种情形我就会 ...
- IDEA maven 项目 如何获取项目离线运行所需的全部依赖( .m2格式)
背景:maven项目要将整个项目的依赖移植到某无法联网服务器进行测试,需要项目离线运行所需的全部依赖 步骤: 1. 首先需要有项目源码,解压后,使用IDEA Open Project 2. 在Sett ...
- C#设计模式入门实战教程
什么是设计模式 设计模式是对面向对象设计中反复出现的问题的解决方案.它们提供了被反复使用.多数人知晓的.经过分类编目的代码设计经验总结. 设计模式的作用 提高代码的可重用性:通过定义一套标准的解决方案 ...
- webpack系列-externals配置使用(CDN方式引入JS)
如果需要引用一个库,但是又不想让webpack打包(减少打包的时间),并且又不影响我们在程序中以CMD.AMD或者window/global全局等方式进行使用(一般都以import方式引用使用),那就 ...
- ASP.NET Core – Configuration & Options
前言 之前就写过 Asp.net core 学习笔记 ( Configuration 配置 ) 只是有点乱, 这篇作为整理版. 项目中会有许许多多的 Config 要设定. 比较好的管理方式是把它们放 ...
- 2019牛客暑期多校训练营(第四场)J-free(分层图最短路)
>传送门< 题意:给你n个城市,m条道路,经过每一条要花费这条路的代价,现给你k个机会,使得最多k条路的代价为0,问从起点s到终点t花费的最少代价 思路:分层图最短路经典裸题 方法一 Co ...