【题目来源】
https://www.acwing.com/problem/content/1022/

【题目描述】
潜水员为了潜水要使用特殊的装备。
他有一个带2种气体的气缸:一个为氧气,一个为氮气。
让潜水员下潜的深度需要各种数量的氧和氮。
潜水员有一定数量的气缸。
每个气缸都有重量和气体容量。
潜水员为了完成他的工作需要特定数量的氧和氮。
他完成工作所需气缸的总重的最低限度的是多少?

例如:潜水员有5个气缸。每行三个数字为:氧,氮的(升)量和气缸的重量:
3 36 120
10 25 129
5 50 250
1 45 130
4 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

【二维费用的背包问题算法分析】
二维费用的背包问题,即具有两种限制条件的背包问题,它是常见背包问题的一个简单的常见扩展。也就是说,常见的背包问题都会存在二维费用的扩展。如二维费用的0-1背包问题、二维费用的完全背包问题、二维费用的多重背包问题、二维费用的分组背包问题等。

二维费用的背包问题,要求对于装入背包的每个物品 i,必须同时满足两种不同的限制条件 vol1[i] 与 vol2[i],且每种限制条件的上限分别为 V1 与 V2。若设将物品 i 装入背包可获得的价值为 val[i],请问怎么选择物品,可得到最大价值。

下面以二维费用的0-1背包问题为例,给出一般的二维费用背包问题的解题思路如下:
令 c[i][j][k] 表示将前 i 个物品装入限制条件1为 j、限制条件2为 k 时,可获得的最大价值。
根据求解普通0-1背包问题的状态转移方程的思路,相应可得二维费用的0-1背包问题的状态转移方程为:c[i][j][k] = max(c[i−1][j][k], c[i−1][j−vol1[i]][k−vol2[i]] + val[i] )

类似于将普通0-1背包问题由二维优化为一维的思路(https://blog.csdn.net/hnjzsyjyj/article/details/126071689),可以将二维费用的0-1背包问题由三维优化为二维,从而达到降低算法时间复杂度的目的。优化为二维后的二维费用的0-1背包问题的状态转移方程为:c[j][k] = max(c[j][k], c[j−vol1[i]][k−vol2[i]] + val[i])

编写代码时,一般采用如下的3重循环:

for (i=1; i<=n; i++)   // 此行语句也常用 while(n--) 代替,其中的n为物品个数for (j=V1; j>=vol1[i]; j--)for (k=V2; k>=vol2[i]; k--) {c[j][k]=max(c[j][k],c[j-vol1[i]][k-vol2[i]]+val[i]);}

所求最大价值为c[V1][V2]。

【本题算法分析】
参考:https://blog.csdn.net/Jacob0824/article/details/123434167

(1)初始化的细节处理:(对于要求体积 “至少是” 问题的初始化处理)
● dp(0)(0)(0)=0:第一维为0(一件物品都不选),第二维和第三维体积均为0(氧气和氮气体积至少为0),这种情况是合法的,且min值为0。
● dp(0)(1,2,3...)(1,2,3...):第一维为0(一件物品都不选),第二维和第三维体积至少为i(1,2,3…),
根据实际,这些状态都是不合法的(无法求min),因此将它们初始化为 ∞ 即可(至于是+∞还是-∞取决于这个问题是求的最大值还是最小值)

(2)即使所需要的氧气或者氮气所需的是数量是负数,这种状态也是合法的,其与所需数量为0是等价的,可以通过所需数量为0来转移。

【算法代码】

#include<bits/stdc++.h>
using namespace std;const int V1=22;
const int V2=80;
int c[V1][V2];int main() {int ox,ni,T;cin>>ox>>ni>>T;memset(c,0x3f3f3f3f,sizeof(c));c[0][0]=0;while(T--) {int vol1,vol2,val;cin>>vol1>>vol2>>val;for(int j=ox; j>=0; j--) {for(int k=ni; k>=0; k--) {c[j][k]=min(c[j][k],c[max(0,j-vol1)][max(0,k-vol2)]+val);}}}cout<<c[ox][ni]<<endl;return 0;
}/*
in:
5 60
5
3 36 120
10 25 129
5 50 250
1 45 130
4 20 119out:
249
*/

【参考文献】
https://www.acwing.com/file_system/file/content/whole/index/content/337508/
https://www.acwing.com/solution/content/97152/
https://blog.csdn.net/m0_63666897/article/details/124516938
https://www.cnblogs.com/cs-whut/p/16104881.html
https://www.acwing.com/problem/content/description/8/
https://www.acwing.com/solution/content/97088/
https://blog.csdn.net/weixin_51216553/article/details/123781424

潜水员 ← 二维费用的背包问题相关推荐

  1. 背包九讲之五(二维费用的背包问题)

    http://acm.fafu.edu.cn/problem.php?id=1499 1 /* 2 二维费用的背包问题是指:对于每件物品,具有两种不同的费用, 3 选择这件物品就必须付出这两种代价,每 ...

  2. HDU 2159 FATE 动态规划二维费用的背包问题

    http://acm.hdu.edu.cn/showproblem.php?pid=2159 题意: 给出的n , m , k ,s 分别代表还需n经验升级.还有m耐久度.下面有k组数据.最多能杀s只 ...

  3. 九大背包问题专题--二维费用的背包问题

    5.二维费用的背包问题 问题: 有N件物品和一个容量是V的背包,背包能承受的最大重量是M. 每件物品只能用一次,体积是vi,重量是mi,价值是wi. 求解将哪些物品装入背包,可使这些物品的总体积不超过 ...

  4. 第五讲 二维费用的背包问题 HD FATE(二维完全背包)

    FATE Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. xynuoj 1423 贪婪戈尔曼(二维费用的背包问题)

    1423: 贪婪戈尔曼 时间限制: 1 Sec  内存限制: 128 MB 提交: 26  解决: 16 您该题的状态:已完成 [提交][状态][讨论版] 题目描述 从前有2只狗,大的叫大狗,小的叫小 ...

  6. 潜水员(二维费用的背包问题)

    [题目描述] 潜水员为了潜水要使用特殊的装备.他有一个带2种气体的气缸:一个为氧气,一个为氮气.让潜水员下潜的深度需要各种的数量的氧和氮.潜水员有一定数量的气缸.每个气缸都有重量和气体容量.潜水员为了 ...

  7. acwing算法题--二维费用的背包问题

    原题链接:https://www.acwing.com/problem/content/8/ #include <iostream>using namespace std;const in ...

  8. 背包问题进阶优雅总结【二维费用+分组+有依赖】

    目录 作者有话说 二维费用的背包问题 状态定义及转移 物品总个数的限制 小结 分组的背包问题 状态定义及转移 小结 有依赖的背包问题(重要) 分析 最后是非常不正经的ending 作者有话说 本篇博文 ...

  9. 二维费用 hdu 2159 FATE(完全背包)HDU OJ 4501 小明系列故事——买年货【DP】

    二维费用的背包问题是指:对于每件物品,具有两种不同的费用:选择这件物品必须同时付出这两种代价:对于每种代价都有一个可付出的最大值(背包容量).问怎样选择物品可以得到最大的价值.设这两种代价分别为代价1 ...

最新文章

  1. [智力问答] 十个最难的字 你认识几个
  2. linux的模块化,GoboLinux 017 发布,模块化的 Linux 发行版
  3. 静态路由实验配置举例
  4. palindromic java_Longest Palindromic Substring leetcode java
  5. 实例讲解webpack的基本使用第二篇
  6. 烽火交换机s5800配置说明_如何通过单臂路由实现VLAN间通信?(配置篇)
  7. P1120-小木棍 [数据加强版]
  8. 什么是三层交换,说说和路由的区别在那里?(转)
  9. keil5 配置 stm32f103rc 软件仿真
  10. vbs 获取计算机主机名,vbs 获取主机名
  11. oracle 删除函数对象不存在_Python 函数式编程指北,不只是面向对象哦
  12. WP7 : FrameworkDispatcher.Update has not been called when recording audio(wp7 录音)
  13. UDP网络编程-广播
  14. 个性化推荐系统实践应用
  15. excel数据库_EXCEL数据库DSUM DMAX DMIN DAVERAGE函数的用法
  16. three.js教程和手册
  17. 声律启蒙--喜欢这个韵律
  18. 2020年全球救市两种方法的分析,从世界高度来理解富人思维
  19. 福建省计算机二级登录入口,福建省教育考试院官网登录入口
  20. 项目一 认识Linux操作系统

热门文章

  1. 优漫动游达芬奇调色需要学习多长时间,难不难学呢?
  2. 操作系统实验一·创建进程
  3. 保定峻熙红帽linux认证
  4. 怎么提高WIFI信号?提高无线WIFI信号的方法教程
  5. 【回答问题】ChatGPT上线了!推荐30个以上比较好的中文bert系列的模型/压缩模型
  6. 算法练习--字母移位
  7. 2019-06-18-关于outlook日历和手机同步的方法?
  8. No bean named ‘transactionManager‘ available: No matching TransactionManager bean found for qualifie
  9. 基于遗传算法的排课设计
  10. Android SDK与Android模拟器安装