您的位置:首页 > 其它

[POI][Ruvtex 31]潜水员问题(动态规划)

2009-08-17 17:21 253 查看
【题目描述】:

http://www.ruvtex.cn/cogs/problem/pdetail.php?pid=31

P.s.个人比较喜欢Byvoid神牛的这个Oj。字很大,而且清楚。使用文件,界面简洁~~

【题目分析】:

最开始果然被唬住了。

实际上就是有两个约束条件的背包。

可能情况有一点不一样的就是,他判断的不是一个点,而是大于一个点的一个范围。

跟背包一样,就是更新的时候加一句话就行。

最开始看了还以为是np呢~

就是这样的一个条件泄露了天机:

在文件的第一行中有两个整数 t 和 a ,分别描述完成任务所需的氧气和氮气量。( 1 ≤ t ≤ 21 , 1 ≤ a ≤ 79 )。第二行中有一个整数 n ,表示气筒的个数。( 1 ≤ n ≤ 1000 )。以后 n 行中,每行有三个整数 t i , a i , w i , t i 表示第 i 个气筒所能容纳的氧气量, a i 表示第 i 个气筒所能容纳的氮气量, w i 表示气筒 i 的质量。( 1 ≤ a i ≤ 21 , 1 ≤ t i ≤ 79 , 1 ≤ w i ≤ 800 )。

【代码】:

program ple;
const
inf=1000000;
var
ox,da,mg:longint;
f:array[0..100,0..100] of longint;
oxy,dan,n,i,j,k,ans,a:longint;
function min(x,y:longint):longint;
begin
if x<y then exit(x)
else exit(y);
end;
begin
assign(input,'ple.in');
assign(output,'ple.out');
reset(input); rewrite(output);
readln(oxy,dan);
readln(n);
filldword(f,sizeof(f) div 4,inf);
f[0,0]:=0; ans:=inf;
for k:=1 to n do
begin
readln(ox,da,mg);
for i:=100 downto ox do
for j:=100 downto da do
begin
f[i,j]:=min(f[i,j],f[i-ox,j-da]+mg);
if (i>=oxy) and (j>=dan) and (f[i,j]<ans) then
ans:=f[i,j];
end;
end;
writeln(ans);
close(input); close(output);
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: