题目描述:

潜水员为了潜水要使用特殊的装备。

他有一个带2种气体的气缸:一个为氧气,一个为氮气。

让潜水员下潜的深度需要各种数量的氧和氮。

潜水员有一定数量的气缸。

每个气缸都有重量和气体容量。

潜水员为了完成他的工作需要特定数量的氧和氮。

他完成工作所需气缸的总重的最低限度的是多少?

例如:潜水员有5个气缸。每行三个数字为:氧,氮的(升)量和气缸的重量:

3 36 12010 25 1295 50 2501 45 1304 20 119

如果潜水员需要5升的氧和60升的氮则总重最小为249(1,2或者4,5号气缸)。

你的任务就是计算潜水员为了完成他的工作需要的气缸的重量的最低值。

输入格式

第一行有2个整数 m,n。它们表示氧,氮各自需要的量。

第二行为整数 k表示气缸的个数。

此后的 k行,每行包括ai,bi,ci,3个整数。这些各自是:第 i个气缸里的氧和氮的容量及汽缸重量。

输出格式

仅一行包含一个整数,为潜水员完成工作所需的气缸的重量总和的最低值。

数据范围

1≤m≤21,
1≤n≤79,
1≤k≤1000,
1≤ai≤21,
1≤bi≤79,
1≤ci≤800

输入样例:

5 60
5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119

输出样例:

249

分析:

本题与二维费用的背包问题有所不同,一般的二维费用背包问题,是指花费1和花费2不超过某个数的最大价值。而本题相反,需要求出满足氧气和氮气体积需要的前提下所带气缸的最小重量,抽象一下就是花费1和花费2不小于某数的最小价值。

即状态表示f[i][j][k]表示满足在前i个气缸中选择若干个气缸使得氧气体积不小于j,氮气体积不小于k,气缸重量的最小值。状态转移方程为f[i][j][k] = min(f[i-1][j][k],f[i-1][j-v1][k-v2]+w)。状态转移方程与普通的二维费用背包问题只是min与max的差别,但是状态的边界条件却大不相同。先回忆下普通的二维费用背包问题状态转移方程为f[i][j][k] = max(f[i-1][j][k],f[i-1][j-v1][k-v2]+w),j >= v1,k >= v2,边界条件为f[0][0][0] = 0,f[0][j][k] = 0,因为此时f[i][j][k]表示的是前i个物品中选择的体积1不超过j,体积2不超过k的最大价值。但是对于本题而言,除了f[0][0][0] = 0表示一个物品都不选体积1不小于0,体积2不小于0的最小重量是0外,其它的边界都不相同,对于f[0][j][k],j和k一般认为是大于0的,一个物品都不选,体积1和体积2不可能是不小于j和k,所以这种状态不可达,设置为INF。另外,本题的j与k不都大于0的状态也是合法的,比如f[0][-1][-1],尽管一个物品都不选,显然体积是大于负数的,所以j >= v1,k >= v2的条件没有必要。f[0][j][k],j与k都小于0一个物品都不选重量肯定是0,所以当j - v1 < 0,k - v2 < 0时可以直接将其视为f[0][0][0]=0,故总合考虑j与k大于小于0的情况,得到最终的状态转移方程为f[i][j][k] = min(f[i-1][j][k],f[i-1][max(0,j-v1)][max(0,k-v2)]+w),求的是f的最小值,初始的f数组除了f[0][0][0]外都应被设置为INF。下面直接写成滚动数组的形式,每一种状态都只用到了上一层左边的状态,所以状态的转移需要倒着枚举。

需要注意的是,之所以在转移转态时循环只需要枚举到m和n,是因为超过m和n的状态早已经被考虑过了,比如f[1][1][1]在枚举时上一层的状态f[0][1][1] = INF,所以会由f[0][1-v1][1-v2]转移而来,如果v1和v2都大于1,从j,k是负数的状态转移到f[1][1][1]就相当于考虑到了体积超过1的情况了。更直观的例子比如要氧气和氮气的体积分别不小于5和7,气缸1,氧气体积3,氮气体积4,;气缸2,氧气体积4,氮气体积5,我们在转移到最终的状态f[2][5][7]时,显然要从f[1][5-4][7-5],即f[1][1][2]的状态转移而来,正因为f[1][1][2]可以由负数状态转移而来,所以f[1][1][2]与f[1][3][4]是相等的,也就是计算出f[2][5][7]的值等同于计算出了f[2][7][9]的值,因此不需要再枚举超过m和n的状态了。

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int M = 25,N = 80;
int f[M][N];
int main(){int n,m,k,a,b,c;scanf("%d%d%d",&m,&n,&k);memset(f,0x3f,sizeof f);f[0][0] = 0;for(int i = 1;i <= k;i++){scanf("%d%d%d",&a,&b,&c);for(int j = m;j >= 0;j--){for(int k1 = n;k1 >= 0;k1--){int t1 = max(j-a,0),t2 = max(k1-b,0);f[j][k1] = min(f[j][k1],f[t1][t2]+c);}}}printf("%d\n",f[m][n]);return 0;
}

AcWing 1020 潜水员相关推荐

  1. AcWing 1020 潜水员 题解 (动态规划—DP—背包问题)

    原题传送门 为什么上面的代码 j只需要遍历到v,k只能遍历到m.而下面的代码 j还需要遍历到0,k还需要遍历到0 ?同时为什么氧气或者氮气所需的是数量是负数时,可以与数量0的状态等价? 解答:对比两题 ...

  2. AcWing 1020. 潜水员(二维费用背包)

    一.问题 二.思路 这道题其实很容易看出是一个二维费用背包的变形,如果我们将氧气看作体积,将氮气看作价值的话,这道题就变成了从 i i i个物品里面选,体积至少为 m m m,价值至少为 n n n的 ...

  3. 【ACWing】1020. 潜水员

    题目地址: https://www.acwing.com/problem/content/1022/ 潜水员为了潜水要使用特殊的装备.他有一个带 2 2 2种气体的气缸:一个为氧气,一个为氮气.让潜水 ...

  4. 数字三角形,最长上升子序列,背包模型 AcWing算法提高课 (详解)

    目录 数字三角形模型(只能向右和向下或向左和向上) AcWing 1015. 摘花生 AcWing 1018. 最低通行费(曼哈顿距离-向右和向下-求最小值-初始化) AcWing 1027. 方格取 ...

  5. acwing提高组 第一章 动态规划

    文章目录 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP oj链接 数字三角形模型 AcWing 1015. 摘花 ...

  6. Acwing算法—动态规划

    目录 数字三角形模型 AcWing 898. 数字三角形 AcWing 1015. 摘花生 AcWing 1018. 最低通行费 AcWing 1027. 方格取数 AcWing 275. 传纸条 最 ...

  7. 算法——AcWing算法提高课中代码和题解

    文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...

  8. AcWing算法提高课

    1. 动态规划(43/68) 1.1 数字三角形模型(4/4) 1.1.1 AcWing 1015. 摘花生 结论: f[i][j]=max⁡(f[i−1][j],f[i][j−1])+w[i][j] ...

  9. 【动态规划】背包模型

    以下题目.题解思路等等均来自AcWing算法提高课,感兴趣的同学欢迎点击下方链接了解一下. https://www.acwing.com/activity/content/introduction/1 ...

最新文章

  1. R语言ggplot2可视化绘制累积计数图(累加图,cumulative counts)
  2. activiti no processes deployed with key
  3. 洛谷P1162 填涂颜色
  4. 猜猜乐游戏php源码,C/C++百行代码实现热门游戏消消乐功能的示例代码
  5. 视觉SLAM学习--视觉定位比赛(CVPR2020)
  6. keras从入门到放弃(十三)卷积神经网络处理手写数字识别
  7. SAP Odata服务里filter的用法
  8. jsp调试,异常行数不匹配
  9. Linux Shell笔记5 Linux的文件系统
  10. Packt发布了2018年技能提升报告
  11. 从食品质检员到代码工程师,大哥你就这样跳槽进了阿里巴巴?
  12. HTML5 目前无法实现的5件事
  13. 【图像隐写】基于matlab DWT数字水印多种攻击效果对比【含Matlab源码 1134期】
  14. 小程序超过2M限制的方法——分包加载
  15. Python整数求和
  16. 二级域名分发系统美化版源码+内附搭建教程
  17. 深入解读-微信小程序SDK
  18. BiMap(HashBiMap,EnumBiMap,ImmutableBiMap)实战
  19. python爬虫:获取菜鸟网站上url
  20. Outlook2007备份邮件规则、联系人以及账号及在Outlook 2007中删除自动记忆的收件人...

热门文章

  1. 交管12123服务器维护,交管12123支付宝打不开解决方法
  2. 设置VLC窗口大小不随视频分辨率改变
  3. 苹果8怎么投屏到电视_苹果怎么投屏到电视?简单操作就用这个办法
  4. 清官的口碑 ——读《海瑞——古怪的模范官僚》
  5. 仙魔契约显示当前服务器爆满,《仙魔契约》帮会系统
  6. 到梦空间发布资格考试答题
  7. EOS 源代码解读 (2)插件-set_program_options
  8. 从零开始学安卓笔记:Android基础知识点
  9. js向服务器写入文件,js创建、写入、读取文件、FileSystemObject
  10. SpringCloud Gateway 通过redis实现限流【SpringCloud系列8】