装备运输( Transpor .pas / c / cpp )

时间:2022-02-28 19:28:00
 装备运输( Transpor .pas / c / cpp )

【题目描述】

德国放松对英国的进攻后,把矛头指向了东边——苏联。1943年初,东线的战斗进行到白热化阶段。据可靠情报,90余万德国军队在库尔斯克准备发动浩大攻势。因此,朱可夫元帅要求你立即从远东的军工厂运输大量装备支援库尔斯克前线。列车司机告诉你,一趟列车最多可以容纳V体积的武器装备,但是你可能不能装满,因为列车承受不了那么大的重量,一趟列车最多可以承载C单位的重量。同时,军工厂仓库提供给你一份装备清单,详细记录了每件装备的体积、重量和火力。为了有效支援朱可夫元帅,你要找到一种方案,使得总火力值最大。

【输入数据】

第一行:V和G表示最大重量和体积。

第二行:N表示仓库有N件装备。

第三到N + 2行:每行3个数Ti Vi Gi表示各装备的火力值、体积和重量。

【输出数据】

输出一个数,表示可能获得的最大火力值。

【样例输入】

6 5

4

10 2 2

20 3 2

40 4 3

30 3 3

【样例输出】

50

【 数据范围 】

对于50%的数据,V,G,N<=100;对于100%的数据, V,G,N<=400。

=================================

双背包...

=====================

type
  re=record
       t,v,g:longint;
     end;
var
  v,g:longint;
  n:longint;
  f:array[0..400,0..400]of longint;
  a:array[1..400]of re;
procedure init;
begin
  assign(input,'transport.in');
  assign(output,'transport.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

procedure main;
var
  i,j,k:longint;
  t,now:longint;
begin
  fillchar(f,sizeof(f),0);
  readln(v,g);
  readln(n);
  for i:=1 to n do
    begin
      readln(a[i].t,a[i].v,a[i].g)
    end;
  for i:=1 to n do
    begin
      for j:=v downto a[i].v do
        for k:=g downto a[i].g do
          begin
            t:=f[j-a[i].v,k-a[i].g]+a[i].t;
            if t>f[j,k] then f[j,k]:=t;
          end;
    end;
  writeln(f[v,g]);
end;

begin
  init;
  main;
  terminate;
end.