RE:StudyDiary——01背包(2020/8/28)
今天学习的是DP里面比较简单的一个问题——01背包
因为题目比较简单这里直接贴上
有 N 件物品和一个容量是 M 的背包。每件物品只能使用一次。
第 i 件物品的体积是 vi,价值是 wi。
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。
最简单的方法是用二维数组表示状态
f[i][j]表示装前i个物品总质量不大于j的最大价值
我们在选择装第i个物品时有两种选择
1.装第i个物品,则f[i][j] = f[i - 1][j - v[i]] + w[i]
2.不装第i个物品,则f[i][j] = f[i - 1][j]
于是我们可得状态方程
if(j < v[i]) //背包装不下第i个物品,我们选择不装
f[i][j] = f[i-1][j];
else .//背包可以装下第i个物品,我们要判断当前的最大价值来决定装不装
f[i][j] = max(f[i-1][j-v[i]] + w[i],f[i-1][j]);
当你了解上面的操作后,同学们就会发现,第i个物品的状态只于第i-1个物品的状态有关,所以我们可以对状态方程进行优化,优化后的方程f[j]表示总质量不大于j的最大价值
核心代码如下
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]);
我们可以发现,关于j的循环我们是从大到小进行的,这是为了保证我们更新最大价值的时候状态一定是从i-1个物品取得的(不明白为什么取i-1的请仔细看上面)
举一个很简单的例子,如果我们从小到大循环,我们可能会出现下面的情况,我们先对f[20]进行了最大价值的更新(此时f[20]是处于装了第i个物品的状态),然后对f[23]进行更新,f[23]的更新是从f[20] + w[i](假设第i个物品质量为3)处取得的,这样我们更新的f[23]并非从第i-1个物品的状态取得,而是第i个物品(相当于装了两个第i个物品)
最后贴一下AC的代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>using namespace std;const int maxn = 1010;
int n,m;
int f[maxn];
int v[maxn],w[maxn];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];return 0;
}
RE:StudyDiary——01背包(2020/8/28)相关推荐
- 2020牛客寒假算法基础集训营3——J.牛牛的宝可梦Go【最短路 DP(01背包) 复杂度优化】(附优化分析)
题目传送门 题目描述 牛牛所在的W市是一个不太大的城市,城市有n个路口以及m条公路,这些双向连通的公路长度均为1,保证你可以从一个城市直接或者间接移动到所有的城市.牛牛在玩宝可梦Go,众所周知呢,这个 ...
- NYOJ 860 又见01背包
有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W 的物品,求所有挑选方案中物品价值总和的最大值. 1 <= n <=100 1 <= wi < ...
- hdu 3449 Consumer 01背包
http://acm.hdu.edu.cn/showproblem.php?pid=3449 这个题AC的有点稀里糊涂(是1A过的),采用的01背包的方法: 思路:定义了两个数组用来存储最终结果和但购 ...
- hdu 3732(01背包转多重背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732 思路:这么大的数据,用01背包肯定会TLE的,01背包转多重背包..最多也就11*11=121件 ...
- 洛谷 P1049 装箱问题(01背包)
一道水题,但看到好久没有发博客了,再一看是一道noip普及组t4,就做了. 题目链接 https://www.luogu.org/problemnew/show/P1049 解题思路 一道裸的01背包 ...
- 杭电1171(01背包求解)
题目: Problem Description Nowadays, we all know that Computer College is the biggest department in HDU ...
- HDu 3449 (有依赖的01背包) Consumer
题意: 有n件物品,对应有不同的价格和价值,这是典型的01背包.但现在有了一个限制,要买物品先买能装这件物品的特定的盒子,盒子的价值为0 代码理解得还不是太好,感觉这是一个"二重" ...
- [UVa1213]Sum of Different Primes(递推,01背包)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- 动态规划-----------01背包,完全背包与多重背包
P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有 ...
最新文章
- SpringMVC学习二
- 「OKR 理论篇」5 分钟快速掌握 OKR 管理法
- 记录一下PyQt5界面导入Python(绕开pyqt5-tools安装失败问题)
- ubuntu截图软件deepin scrot
- PHP学习之[第11讲]新浪微博开放平台 PHP 与 OAuth 接口(1)
- PAT L1-048 矩阵A乘以B
- vmvare连接linux
- HDFS节点内数据平衡
- matplotlib之plot,figure(笔记一)
- Git upstream
- url解码java_JAVA对URL的解码【转】
- MOOS-ivp 实验三 MOOS简介(1)
- Spring Boot项目 Spring Configuration Check Unmapped Spring configuration files found
- Ubuntu安装wine,安装windows软件
- 因ubuntu内核升级导致的显卡驱动问题的解决方案
- 大连东软c语言编程题,大连东软信息学院C语言实验一 windows基本操作和turboc使用答案.doc...
- 嵌入式是什么 ?为什么要学好嵌入式呢?
- 你应该知道的Android签名知识
- day37 XSS跨站权限维持钓鱼捆绑浏览器漏洞
- .NET破解之PDFdo转换器
热门文章
- python使用Augmentor对图像分割数据集中原图和标签mask同时进行变换
- 一建和二建可以同时注册吗?
- Python 批量处理PNG、JPG图片 去白边
- 鸿蒙之初彩蛋攻略,神都夜行录鸿蒙之境开明boss机制讲解 boss开明打法阵容攻略[多图]...
- 微信小程序实现类似抖音效果
- VHDL VGA 时钟处理 转盘形式 源代码
- 医疗直播怎么做?直播前准备篇
- 文件夹中的多Excel文件合并
- [C/C++]浅析C++中的模板
- L1-039 古风排版 (20 分)python