潛水員(動態規劃)

2021-07-11 02:00:05 字數 1736 閱讀 9191

description

潛水員為了潛水要使用特殊的裝備。他有乙個帶2種氣體的氣缸:乙個為氧氣,乙個為氮氣。讓潛水員下潛的深度需要各種的數量的氧和氮。潛水員有一定數量的氣缸。每個氣缸都有重量和氣體容量。潛水員為了完成他的工作需要特定數量的氧和氮。他完成工作所需氣缸的總重的最低限度的是多少? 

例如:潛水員有5個氣缸。每行三個數字為:氧,氮的(公升)量和氣缸的重量: 

3 36 120 

10 25 129 

5 50 250 

1 45 130 

4 20 119 

如果潛水員需要5公升的氧和60公升的氮則總重最小為249 (1,2或者4,5號氣缸)。 

你的任務就是計算潛水員為了完成他的工作需要的氣缸的重量的最低值。 

input

從文字檔案gas.in中讀入資料。 

第一行有2整數t,a(1<=t<=21,1<=a<=79)。它們表示氧,氮各自需要的量。 

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

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

output

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

sample input

5 60 

3 36 120 

10 25 129 

5 50 250 

1 45 130 

4 20 119

sample output

249

解題思路:

用f[i,j]表示付出費用v、最多選m件時可得到的最大價值,狀態轉移方程為:

f[j,k]=max

(1<=i<=k,v>=j>=0,u>=k>=0)

f[v,u]為所求。

時間複雜度:

o(k*v*u)

程式:var

a,b,c:array [0..1000] of longint;

f:array [0..100,0..100] of longint;

t,s,v,u,k,m,i,j,l:longint;

begin

fillchar(f,sizeof(f),$7f);

f[0,0]:=0;

readln(v,u);

readln(k);

for i:=1 to k do

read(a[i],b[i],c[i]);

for i:=1 to k do

for j:=v downto 0 do

for l:=u downto 0 do

begin

t:=j+a[i];

s:=l+b[i];

if j+a[i]>v then t:=v;

if l+b[i]>u then s:=u;

if f[t,s]>f[j,l]+c[i] then f[t,s]:=f[j,l]+c[i];

end;

writeln(f[v,u]);

end.

版權屬於: chris

NOIP 模擬 潛水員 DP

潛水員為了潛水要使用特殊的裝備。他有乙個帶2種氣體的氣缸 乙個為氧氣,乙個為氮氣。讓潛水員下潛的深度需要各種的數量的氧和氮。潛水員有一定數量的氣缸。每個氣缸都有重量和氣體容量。潛水員為了完成他的工作需要特定數量的氧和氮。他完成工作所需氣缸的總重的最低限度的是多少?例如 潛水員有5個氣缸。每行三個數字...

2823 例9 15 潛水員

題目描述 潛水員為了潛水要使用特殊的裝備。他有乙個帶2種氣體的氣缸 乙個為氧氣,乙個為氮氣。讓潛水員下潛的深度需要各種的數量的氧和氮。潛水員有一定數量的氣缸。每個氣缸都有重量和氣體容量。潛水員為了完成他的工作需要特定數量的氧和氮。他完成工作所需氣缸的總重的最低限度的是多少?例如 潛水員有5個氣缸。每...

簡單揹包練習 潛水員

時間限制 1 sec 記憶體限制 128 mb 提交 50 解決 17 提交 狀態 討論版 潛水員為了潛水要使用特殊的裝備。他有乙個帶2種氣體的氣缸 乙個為氧氣,乙個為氮氣。讓潛水員下潛的深度需要各種的數量的氧和氮。潛水員有一定數量的氣缸。每個氣缸都有重量和氣體容量。潛水員為了完成他的工作需要特定數...