【ACWing】1020. 潜水员
题目地址:
https://www.acwing.com/problem/content/1022/
潜水员为了潜水要使用特殊的装备。他有一个带 2 2 2种气体的气缸:一个为氧气,一个为氮气。让潜水员下潜的深度需要各种数量的氧和氮。潜水员有一定数量的气缸。每个气缸都有重量和气体容量。潜水员为了完成他的工作需要特定数量的氧和氮。他完成工作所需气缸的总重的最低限度的是多少?例如:潜水员有 5 5 5个气缸。每行三个数字为:氧,氮的(升)量和气缸的重量:
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119
如果潜水员需要 5 5 5升的氧和 60 60 60升的氮则总重最小为 249 249 249( 1 1 1, 2 2 2或者 4 4 4, 5 5 5号气缸)。你的任务就是计算潜水员为了完成他的工作需要的气缸的重量的最低值。
输入格式:
第一行有 2 2 2个整数 m m m, n n n。它们表示氧,氮各自需要的量。第二行为整数 k k k表示气缸的个数。此后的 k k k行,每行包括 a i a_i ai, b i b_i bi, c i c_i ci, 3 3 3个整数。这些各自是:第 i i i个气缸里的氧和氮的容量及气缸重量。
输出格式:
仅一行包含一个整数,为潜水员完成工作所需的气缸的重量总和的最低值。
数据范围:
1 ≤ m ≤ 21 1≤m≤21 1≤m≤21
1 ≤ n ≤ 79 1≤n≤79 1≤n≤79
1 ≤ k ≤ 1000 1≤k≤1000 1≤k≤1000
1 ≤ a i ≤ 21 1≤ai≤21 1≤ai≤21
1 ≤ b i ≤ 79 1≤bi≤79 1≤bi≤79
1 ≤ c i ≤ 800 1≤ci≤800 1≤ci≤800
思路是动态规划。设 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]是只取前 i i i个气缸的情况下,要含氧量大于等于 j j j并且含氮量大于等于 k k k,所有方案里的气缸最小重量。那么可以按照第 i i i个气缸取不取来分类,如果不取,那么最小重量就是 f [ i − 1 ] [ j ] [ k ] f[i-1][j][k] f[i−1][j][k];如果取,那么除了这个气缸以外,剩余气缸的含氧量只需要达到 max { j − a i , 0 } \max\{j-a_i,0\} max{j−ai,0},并且含氮量只需要达到 max { k − b i , 0 } \max\{k-b_i, 0\} max{k−bi,0}即可(也就是说 f [ i − 1 ] [ max { j − a i , 0 } ] [ max { k − b i , 0 } ] + c i f[i-1][\max\{j-a_i,0\}][\max\{k-b_i,0\}]+c_i f[i−1][max{j−ai,0}][max{k−bi,0}]+ci一定已经考虑了所有含第 i i i个气缸的方案了)。所以有: f [ i ] [ j ] [ k ] = min { f [ i − 1 ] [ j ] [ k ] , f [ i − 1 ] [ max { j − a i , 0 } ] [ max { k − b i , 0 } ] + c i } f[i][j][k]=\min\{f[i-1][j][k],f[i-1][\max\{j-a_i,0\}][\max\{k-b_i,0\}]+c_i\} f[i][j][k]=min{f[i−1][j][k],f[i−1][max{j−ai,0}][max{k−bi,0}]+ci}可以用类似 0 − 1 0-1 0−1背包的方式优化,只存两维,然后每个内层循环从大到小遍历。代码如下:
#include <iostream>
#include <cstring>
using namespace std;const int N = 25, M = 80;// n是氧需要的量,m是氮需要的量,K是气缸个数
int n, m, K;
int f[N][M];int main() {cin >> n >> m >> K;// 初始化为正无穷memset(f, 0x3f, sizeof f);// 没有气缸可供选择,并且要求含氧量和含氮量都大于等于0,什么都不选是个合法方案,其总重量是0f[0][0] = 0;while (K--) {// 分别是氧、氮容量和气缸重量int v1, v2, w;cin >> v1 >> v2 >> w;for (int i = n; i >= 0; i--)for (int j = m; j >= 0; j--)f[i][j] = min(f[i][j], f[max(i - v1, 0)][max(j - v2, 0)] + w);}cout << f[n][m] << endl;return 0;
}
时间复杂度 O ( m n k ) O(mnk) O(mnk),空间 O ( m n ) O(mn) O(mn)。
【ACWing】1020. 潜水员相关推荐
- AcWing 1020 潜水员
题目描述: 潜水员为了潜水要使用特殊的装备. 他有一个带2种气体的气缸:一个为氧气,一个为氮气. 让潜水员下潜的深度需要各种数量的氧和氮. 潜水员有一定数量的气缸. 每个气缸都有重量和气体容量. 潜水 ...
- AcWing 1020 潜水员 题解 (动态规划—DP—背包问题)
原题传送门 为什么上面的代码 j只需要遍历到v,k只能遍历到m.而下面的代码 j还需要遍历到0,k还需要遍历到0 ?同时为什么氧气或者氮气所需的是数量是负数时,可以与数量0的状态等价? 解答:对比两题 ...
- AcWing 1020. 潜水员(二维费用背包)
一.问题 二.思路 这道题其实很容易看出是一个二维费用背包的变形,如果我们将氧气看作体积,将氮气看作价值的话,这道题就变成了从 i i i个物品里面选,体积至少为 m m m,价值至少为 n n n的 ...
- 数字三角形,最长上升子序列,背包模型 AcWing算法提高课 (详解)
目录 数字三角形模型(只能向右和向下或向左和向上) AcWing 1015. 摘花生 AcWing 1018. 最低通行费(曼哈顿距离-向右和向下-求最小值-初始化) AcWing 1027. 方格取 ...
- acwing提高组 第一章 动态规划
文章目录 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP oj链接 数字三角形模型 AcWing 1015. 摘花 ...
- Acwing算法—动态规划
目录 数字三角形模型 AcWing 898. 数字三角形 AcWing 1015. 摘花生 AcWing 1018. 最低通行费 AcWing 1027. 方格取数 AcWing 275. 传纸条 最 ...
- 算法——AcWing算法提高课中代码和题解
文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...
- 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] ...
- 【动态规划】背包模型
以下题目.题解思路等等均来自AcWing算法提高课,感兴趣的同学欢迎点击下方链接了解一下. https://www.acwing.com/activity/content/introduction/1 ...
最新文章
- maven 与intellij IDEA 下maven 为groovy 项目生成jar 详解
- Atitit.去除水印的方案
- bzoj4034: [HAOI2015]树上操作
- 使用Spring进行不同开发所需要用到的包
- 如何开始 java core java
- 去哪儿网2018春招软件开发工程师、前段开发工程师编程题 - 题解
- 没有信号无服务器,没有信号不用怕“音离”你身边的便携式基站
- -bash: wget 未找到命令的解决办法
- 红帽学习笔记[RHCSA] 第六课[进程、服务相关]
- matlab如何获得一个二值掩码,1.3矩阵的掩码操作 - osc_uarhdl2n的个人空间 - OSCHINA - 中文开源技术交流社区...
- 制冷行业人人必备的设计与仿真软件大全!(附下载)
- 图像特征提取:Sobel边缘检测
- 镜子中的 Google
- 按键弹起、按下的事件
- 朱清时的10本推荐书
- 【故障处理】IMP-00010错误 12C的dmp文件导入11G
- NBIOT模块 BC26升级固件
- Nginx 学习总结
- 台达变频器vfb—d参数表_台达变频器参数设置一览表
- CentOS怎么正确安装ag工具