Cod sursa(job #19483)

Utilizator andrewgPestele cel Mare andrewg Data 19 februarie 2007 17:49:21
Problema Ghiozdan Scor 70
Compilator fpc Status done
Runda Arhiva de probleme Marime 1.53 kb
const maxn = 20000;
      maxm = 75000;
      inf = 2000000000;

var f:text;
    n,m,i,j,t,max,maxi:longint;
    a:array[1..maxn]of longint;
    d,l:array[0..maxm]of longint;

procedure readdata;
begin
   assign(f,'ghiozdan.in');
   reset(f);
   readln(f,n,m);
   for i:=1 to n do
   begin
      readln(f,a[i]);
   end;
   close(f);
end;

procedure sort(l,r:longint);
var i,j,x,y:longint;
begin
   i:=l;
   j:=r;
   x:=a[(l+r) div 2];
   repeat
      while a[i]<x do i:=i+1;
      while x<a[j] do j:=j-1;
      if i<=j then
      begin
         y:=a[i];
         a[i]:=a[j];
         a[j]:=y;
         i:=i+1;
         j:=j-1;
      end;
   until i>j;
   if l<j then sort(l,j);
   if i<r then sort(i,r);
end;

procedure solve;
var k:longint;
begin
   sort(1,n);
   max:=0;
   for i:=1 to m do d[i]:=inf;
   d[0]:=0;
   l[0]:=0;
   for i:=n downto 1 do
   begin
      for j:=t downto 0 do
      begin
         if (d[j]+1<d[j+a[i]]) and (j+a[i]<=m) then
         begin
            d[j+a[i]]:=d[j]+1;
            l[j+a[i]]:=i;
            if j+a[i]>max then
            begin
               max:=j+a[i];
            end;
         end;
      end;
      t:=t+a[i];
      if t>m then t:=m;
   end;
end;

procedure writedata;
begin
   assign(f,'ghiozdan.out');
   rewrite(f);
   writeln(f,max,' ',d[max]);
   i:=l[max];
   while max<>0 do
   begin
      writeln(f,a[i]);
      max:=max-a[i];
      i:=l[max];
   end;
   close(f);
end;

begin
   readdata;
   solve;
   writedata;
end.