1. 程式人生 > >【例9.15】潛水員

【例9.15】潛水員

color 特定 cin tdi esp span ont logs 鏈接

【例9.15】潛水員

鏈接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1271


時間限制: 1000 ms 內存限制: 65536 KB

【題目描述】

潛水員為了潛水要使用特殊的裝備。他有一個帶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(1<=m<=21,1<=n<=79)。它們表示氧,氮各自需要的量。

第二行為整數k(1<=n<=1000)表示氣缸的個數。

此後的k行,每行包括ai,bi,ci(1<=ai<=21,1<=bi<=79,1<=ci<=800)3整數。這些各自是:第i個氣缸裏的氧和氮的容量及汽缸重量。

【輸出】

僅一行包含一個整數,為潛水員完成工作所需的氣缸的重量總和的最低值。

【輸入樣例】

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

【輸出樣例】

249
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int o[1005],n[1005],v[1005],f[25][100];
int main()
{
    int O,N,K;
    cin>>O>>N>>K;
    memset(f,127,sizeof(f));
    f[0][0]=0;
    
for(int i=1;i<=K;i++)cin>>o[i]>>n[i]>>v[i]; for(int i=1;i<=K;i++) for(int j=O;j>=0;j--) for(int k=N;k>=0;k--) { int t1=j+o[i],t2=k+n[i]; if(t1>O)t1=O; if(t2>N)t2=N; f[t1][t2]=min(f[t1][t2],f[j][k]+v[i]); } cout<<f[O][N]<<endl; }

【例9.15】潛水員