今天学习的是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)相关推荐

  1. 2020牛客寒假算法基础集训营3——J.牛牛的宝可梦Go【最短路 DP(01背包) 复杂度优化】(附优化分析)

    题目传送门 题目描述 牛牛所在的W市是一个不太大的城市,城市有n个路口以及m条公路,这些双向连通的公路长度均为1,保证你可以从一个城市直接或者间接移动到所有的城市.牛牛在玩宝可梦Go,众所周知呢,这个 ...

  2. NYOJ 860 又见01背包

    有n个重量和价值分别为wi 和 vi 的 物品,从这些物品中选择总重量不超过 W  的物品,求所有挑选方案中物品价值总和的最大值. 1 <= n <=100 1 <= wi < ...

  3. hdu 3449 Consumer 01背包

    http://acm.hdu.edu.cn/showproblem.php?pid=3449 这个题AC的有点稀里糊涂(是1A过的),采用的01背包的方法: 思路:定义了两个数组用来存储最终结果和但购 ...

  4. hdu 3732(01背包转多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732 思路:这么大的数据,用01背包肯定会TLE的,01背包转多重背包..最多也就11*11=121件 ...

  5. 洛谷 P1049 装箱问题(01背包)

    一道水题,但看到好久没有发博客了,再一看是一道noip普及组t4,就做了. 题目链接 https://www.luogu.org/problemnew/show/P1049 解题思路 一道裸的01背包 ...

  6. 杭电1171(01背包求解)

    题目: Problem Description Nowadays, we all know that Computer College is the biggest department in HDU ...

  7. HDu 3449 (有依赖的01背包) Consumer

    题意: 有n件物品,对应有不同的价格和价值,这是典型的01背包.但现在有了一个限制,要买物品先买能装这件物品的特定的盒子,盒子的价值为0 代码理解得还不是太好,感觉这是一个"二重" ...

  8. [UVa1213]Sum of Different Primes(递推,01背包)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  9. 动态规划-----------01背包,完全背包与多重背包

    P01: 01背包问题 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有 ...

最新文章

  1. SpringMVC学习二
  2. 「OKR 理论篇」5 分钟快速掌握 OKR 管理法
  3. 记录一下PyQt5界面导入Python(绕开pyqt5-tools安装失败问题)
  4. ubuntu截图软件deepin scrot
  5. PHP学习之[第11讲]新浪微博开放平台 PHP 与 OAuth 接口(1)
  6. PAT L1-048 矩阵A乘以B
  7. vmvare连接linux
  8. HDFS节点内数据平衡
  9. matplotlib之plot,figure(笔记一)
  10. Git upstream
  11. url解码java_JAVA对URL的解码【转】
  12. MOOS-ivp 实验三 MOOS简介(1)
  13. Spring Boot项目 Spring Configuration Check Unmapped Spring configuration files found
  14. Ubuntu安装wine,安装windows软件
  15. 因ubuntu内核升级导致的显卡驱动问题的解决方案
  16. 大连东软c语言编程题,大连东软信息学院C语言实验一 windows基本操作和turboc使用答案.doc...
  17. 嵌入式是什么 ?为什么要学好嵌入式呢?
  18. 你应该知道的Android签名知识
  19. day37 XSS跨站权限维持钓鱼捆绑浏览器漏洞
  20. .NET破解之PDFdo转换器

热门文章

  1. python使用Augmentor对图像分割数据集中原图和标签mask同时进行变换
  2. 一建和二建可以同时注册吗?
  3. Python 批量处理PNG、JPG图片 去白边
  4. 鸿蒙之初彩蛋攻略,神都夜行录鸿蒙之境开明boss机制讲解 boss开明打法阵容攻略[多图]...
  5. 微信小程序实现类似抖音效果
  6. VHDL VGA 时钟处理 转盘形式 源代码
  7. 医疗直播怎么做?直播前准备篇
  8. 文件夹中的多Excel文件合并
  9. [C/C++]浅析C++中的模板
  10. L1-039 古风排版 (20 分)python