5056 潜水员

时间限制: 1 s

空间限制: 128000 KB

题目等级 : 黄金 Gold

题目描述 Description

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

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

3 36 120

10 25 129

5 50 250

1 45 130

4 20 119

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

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

输入描述 Input Description

第一行有2个整数m,n(1<=m<=21,1<=n<=79)。它们表示氧、氮各自需要的量。

第二行为整数k(1<=k<=1000)表示气缸的个数。

此后的k行,每行包括ai,bi,ci(1<=ai<=21,1<=bi<=79,1<=ci<=800)3整数。这些各自是:第i个气缸里的氧和氮的容量及气缸重量。

输出描述 Output Description

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

样例输入 Sample Input

5 60

5

3 36 120

10 25 129

5 50 250

1 45 130

4 20 119

样例输出 Sample Output

249

数据范围及提示 Data Size & Hint

1<=m<=21,1<=n<=79

1<=k<=1000

1<=ai<=21,1<=bi<=79,1<=ci<=800

/*
恶心写法.
试了好几次才过.
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1001
using namespace std;
int f[MAXN][MAXN],w[MAXN],v1[MAXN],v2[MAXN],m,K,n,ans;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
int main()
{
memset(f,127/3,sizeof(f));ans=f[0][0];
m=read();K=read();n=read();
for(int i=1;i<=n;i++)
v1[i]=read(),v2[i]=read(),w[i]=read();
f[0][0]=0;
for(int i=1;i<=n;i++)
for(int j=20*m;j>=v1[i];j--)
for(int k=20*K;k>=v2[i];k--)
f[j][k]=min(f[j][k],f[j-v1[i]][k-v2[i]]+w[i]);
for(int i=m;i<=20*m;i++)
for(int j=K;j<=20*K;j++)
ans=min(ans,f[i][j]);
printf("%d",ans);
return 0;
}
/*
二维费用背包.
我们不妨将状态由i向i+1转移.
因为题目中对m和k只有下限的要求.
考虑到更优的状态可能在j>=m,k>=K的状态里.
so转移的时候我们把j>=m,k>=K的状态放到f[m][K]里.
因为这些状态是合法的并且无上限要求.
即x=j+v1[i],y=k+v2[i];
if(x>=m) x=m;if(y>=K) y=K;
f[x][y]=min(f[j][k]+w[i],f[x][y]);
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 1001
using namespace std;
int f[MAXN][MAXN],w[MAXN],v1[MAXN],v2[MAXN],m,K,n,ans;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
int main()
{
memset(f,127/3,sizeof(f));ans=f[0][0];
m=read();K=read();n=read();
for(int i=1;i<=n;i++)
v1[i]=read(),v2[i]=read(),w[i]=read();
f[0][0]=0;
for(int i=1;i<=n;i++)
for(int j=m;j>=0;j--)
for(int k=K;k>=0;k--)
{
int x=j+v1[i],y=k+v2[i];
if(x>=m) x=m;
if(y>=K) y=K;
f[x][y]=min(f[j][k]+w[i],f[x][y]);
}
printf("%d",f[m][K]);
return 0;
}

Codevs 5056 潜水员的更多相关文章

  1. codevs 3289 花匠

    题目:codevs 3289 花匠 链接:http://codevs.cn/problem/3289/ 这道题有点像最长上升序列,但这里不是上升,是最长"波浪"子序列.用动态规划可 ...

  2. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  3. codevs 1285 二叉查找树STL基本用法

    C++STL库的set就是一个二叉查找树,并且支持结构体. 在写结构体式的二叉查找树时,需要在结构体里面定义操作符 < ,因为需要比较. set经常会用到迭代器,这里说明一下迭代器:可以类似的把 ...

  4. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  5. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  6. codevs 1228 苹果树 树链剖分讲解

    题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...

  7. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  8. codevs 1052 地鼠游戏

    1052 地鼠游戏 http://codevs.cn/problem/1052/ 题目描述 Description 王钢是一名学习成绩优异的学生,在平时的学习中,他总能利用一切时间认真高效地学习,他不 ...

  9. codevs 2830 蓬莱山辉夜

    2830 蓬莱山辉夜 http://codevs.cn/problem/2830/ 题目描述 Description 在幻想乡中,蓬莱山辉夜是月球公主,居住在永远亭上,二次设定说她成天宅在家里玩电脑, ...

随机推荐

  1. Android动态加载so文件

    在Android中调用动态库文件(*.so)都是通过jni的方式,而且往往在apk或jar包中调用so文件时,都要将对应so文件打包进apk或jar包,工程目录下图: 以上方式的存在的问题: 1.缺少 ...

  2. (原)Eclipse Tomcat配置(2014.12.27——By小赞)

    Eclipse中配置自己已经安装的Tomcat 首先为Eclipse安装Tomcat插件: 进入Tomcat插件下载页:http://www.eclipsetotale.com/tomcatPlugi ...

  3. Redis学习手册

    为什么自己当初要选择Redis作为数据存储解决方案中的一员呢?现在能想到的原因主要有三.其一,Redis不仅性能高效,而且完全免费.其二,是基于C/C++开发的服务器,这里应该有一定的感情因素吧.最后 ...

  4. 教程-Delphi7 自带控件安装对应表

    原来的控件delphi7里何处寻? 经常有朋友提这样的问题,“我原来在delphi5或者delphi6中用的很熟的控件到哪里去了?是不是在delphi7中没有了呢?这是不是意味着我以前写的代码全都不能 ...

  5. STM32F103 与 STM32F407引脚兼容问题

    ===========突袭网收集的解决方案如下=========== 解决方案1: STM32F103有的功能407都有,并且这些功能的引脚完全兼容,只是程序不同而已...而STM32F407有的功能 ...

  6. 检查REDO日志相关信息并生成HTML文件的脚本

    生成HTML格式的文件 内容有: 检查数据库版本.REDO日志组情况, 最近20次日志切换频率检查--日志间的归档时间间隔, 这对查看数据库的IO繁忙时段 统计指定日期当天每小时的归档日志产生量--日 ...

  7. Javascript 基础知识笔记

    标签(空格分隔): 廖老师学习笔记 javascript 基本入门 根据廖雪峰老师官网,自己看后的简单笔记 第一小节 基本知识 <script type="text/javascrip ...

  8. 揭秘淘宝自主研发的文件系统:TFS

    目前,国内自主研发的文件系统可谓凤毛麟角.淘宝在这一领域做了有效的探索和实践,Taobao File System(TFS)作为淘宝内部使用的分布式文件系统,针对海量小文件的随机读写访问性能做了特殊优 ...

  9. Java从设计模式[本场比赛状态转换武器]状态分析(State)模式

    如果我们正在做一个实时战略游戏.我们设计了一个武器,他制作只是当步兵,但他能够切换武器.第一个开关会变成弓箭手,第二个开关导通控股装甲盾牌,第三开关变成步兵--如何实现这一目标切换机构?我们开始思考, ...

  10. 关于IB_DESIGNABLE / IBInspectable的那些事

    前言 IB_DESIGNABLE / IBInspectable 这两个关键字是在WWDC 2014年”What’s New in Interface Builder”这个Session里面,用Swi ...