Cod sursa(job #18608)

Utilizator vladcyb1Vlad Berteanu vladcyb1 Data 18 februarie 2007 12:46:48
Problema Ghiozdan Scor 36
Compilator fpc Status done
Runda preONI 2007, Runda 2, Clasele 11-12 Marime 1.65 kb

  const
       NMAX = 75000;
       infinit = 1000000000;
       FIN = 'ghiozdan.in';
       FOUT = 'ghiozdan.out';

  var A : array[ 0..1, 0..NMAX ] of longint;
      V, C : array[ 1..200 ] of longint;
      M : array[ 0..NMAX ] of longint;
      sel : array[ 1..200 ] of longint;
      n, t, mint, k, p, x, o, oo : longint;
      f, g : text;

  procedure read_Data;
   var i : longint;
   begin
    assign( f, FIN ); reset( f );
    readln( f, n, T ); k := 0;
    for i := 1 to n do
      begin
        read( f, x );
        inc( sel[x] );
      end;
      n := 0;
   for i := 1 to 200 do
     if sel[i] > 0 then
       begin
        inc( n ); v[n] := i; c[n] := sel[i];
        end;
    close( f );
   end;
 function MIN( a, b : longint ) : longint;
  begin
   if a < b then MIN := a else MIN := b;
  end;

   procedure dinamica2;
    var i, j, k : longint;
    begin
     o := 0; oo := 1;
      A[0,0] := 0;
      for i := 1 to T do A[o][i] := infinit;
      for j := 1 to n do
       begin
            for i := 0 to T do
              begin
                A[oo][i] := A[o][i];
                for k := 1 to C[j] do
                  if i - k * v[j] >= 0 then A[oo][i] := MIN( A[o][ i - k * v[j] ] + k, A[oo][i] )
                                      else break;
                end;
       o := 1 - o;
       oo := 1 - oo;
       end;
    for i := T downto 1 do
      if A[o][i] <> infinit then begin p := i; break; end;
       end;

 procedure save;
  begin
   assign( g, FOUT ); rewrite( g );
   writeln( g, p,' ',A[o][p] );
   close( g );
  end;

 begin
  read_data;
  dinamica2;
  save;
 end.