对背包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 == ...
随机推荐
- Minnaert
Minnaert 假设气泡关闭时发生周期性膨胀和收缩,周围水也跟着振动,就嗷地一声叫了出来!设有个半径为 \(r\) 的泡形成后开始简谐振动,半径有 \[r=r_0+a\sin\frac{2\pi t ...
- MessageBox弹出后无响应
这几天学习了自定义模板对话框类,就是说不用系统定义的模板对话框类来创建对话框 消息处理就不用返回0了,可直接返回DefWindowProc HINSTANCE hInstance = ::GetMod ...
- Win32 状态栏用法
WIN32 状态控件用法 1.创建控件 状态栏类名: STATUSCLASSNAME #define STATUSCLASSNAMEW L"msctls_statusbar32 ...
- docker启动一个不停止的centos系统容器
启动的镜像后加上/usr/sbin/init ,前提是镜像中没有设置entrypoint
- csdn 下载券恶心之处
今天在csdn碰到一个恶心事,啥事呢?下载券.详细的说,就是人家码友把下载积分都设置成0了,让大家自行下载.结果,却不行,非得搞个下载券,得去做任务,给它的广告爹爹们点点任务才能获取下载券的code. ...
- TypeScript 5.1 & 5.2
getter 和 setter 可以完全不同类型了 以前我们提过,getter 的类型至少要是其中一个 setter 的类型.这个限制被突破了.现在可以完全使用不同类型了. v5.1 后,没有再报错了 ...
- Azure – Azure Active Directory
前言 虽然它好像是快过时了, 但目前还得用到. 先不研究新的先. Azure 的 service 如果要通过 API 调用的话, 就需要 Azure Active Directory (Azure A ...
- find基础命令与提权教程
关于我 博客主页:https://mp.weixin.qq.com/mp/homepage?__biz=Mzg2Nzk0NjA4Mg==&hid=2&sn=54cc29945318b7 ...
- mysql-存储过程(二)-逻辑判断语句
一,if语句: IF(expr1,expr2,expr3) 如果 expr1 是TRUE (expr1 <> 0 and expr1 <> NULL),则 IF()的返回值为e ...
- php中的跳转
php中的跳转 header("refresh:3;url=http://www.baidu.com";); <meta http-equiv='refresh' conte ...