program corte_bidimensional;
uses crt;
type mat1=array[0..1,0..3300] of integer;
     mat2=array[0..30] of integer;
     mat3=array[0..1,0..4000] of real;
     mat4=array[0..30] of real;
var i:mat1;
    l,w:mat2;
    f:mat3;
    s,t,lr,wr:mat4;
    a,b,k,n,x,count:integer;
    comp,larg,area:real;
    ch:char;
(************************************************************************)
procedure sol(i:mat1 ; l:mat2 ; v,k,k1:integer ; ult:boolean);
var c,p,q:integer;
begin
  c:=v;
  if ult then  writeln('SULUCAO :')
         else  writeln('FAIXA DE LARGURA ',wr[k]:4:0) ;
  while (c>0) and (i[k1,c]>0) do
   begin
     q:=1 ; p:=i[k1,c] ; c:=c-l[p] ;
     while p=i[k1,c] do
      begin
        q:=q+1 ; c:=c-l[p] ;
      end;
      if ult then  writeln(q,' FAIXAS DE LARGURA ',wr[p]:4:0)
             else  writeln(q,' PLACAS DE COMPRIMENTO ',lr[p]:4:0);
   end;
  writeln ; read(ch)
end;
(************************************************************************)
procedure executa(var i:mat1 ; var l:mat2 ; var f:mat3 ; var s:mat4 ;
                  r,n,count:integer);
var k,k1,k2,x:integer;
begin
  k:=1;
  repeat
    k:=k+1;
    if (k mod 2)=0 then begin
                          k1:=0 ; k2:=1 ;
                        end
                   else begin
                          k1:=1 ; k2:=0 ;
                        end;
    for x:=1 to r do
     begin
       if x<l[k] then begin
                        f[k1,x]:=f[k2,x] ; i[k1,x]:=i[k2,x] ;
                      end
                 else if f[k2,x]>f[k1,x-l[k]] + s[k] then
                        begin
                          f[k1,x]:=f[k2,x] ; i[k1,x]:=i[k2,x] ;
                        end
                      else
                        begin
                          f[k1,x]:=f[k1,x-l[k]] + s[k] ;
                          i[k1,x]:=k ;
                        end;
     end;
    if count=0 then begin
                      t[k]:=f[k1,r] ; sol(i,l,r,k,k1,false) ;
                    end
               else if k=n then begin
                                  sol(i,l,r,k,k1,true) ;
                                  writeln ;
                                  comp:=a ; larg:=b ; area:=comp*larg ;
                                  writeln('AREA TOTAL : ',area:12:0) ;
                                  writeln('AREA OCUPADA : ',f[k1,r]:10:0) ;
                                  writeln('OCUPACAO : ',f[k1,r]*100/area:4:1,'%');
                                end;
  until k=n;
end;
(************************************************************************)
begin
  write('numero de objetos  ') ; readln(n) ;
  writeln('entre com comp. e largura dos objetos da seguinte forma');
  writeln('<comp.><esp. branco><larg.>');
  for x:=1 to n do begin
                     readln(lr[x],wr[x]) ; s[x]:=lr[x] * wr[x] ;
                     l[x]:=trunc(lr[x]) ; w[x]:=trunc(wr[x]) ;
                   end;
  writeln('entre comp. e largura da placa da mesma forma'); readln(a,b) ;
  for x:=0 to 1 do begin
                     i[x,0]:=0 ; f[x,0]:=0 ;
                   end;
  for x:=0 to a do f[0,x]:=0;
  for x:=1 to a do begin
                     f[1,x]:=trunc(x/l[1])*s[1] ;
                     if f[1,x]=0 then i[1,x]:=0 else i[1,x]:=1 ;
                   end;
  t[1]:=f[1,a];
  x:=1 ; sol(i,l,a,x,x,false);
  count:=0 ; executa(i,l,f,s,a,n,count);
  for x:=0 to 1 do begin
                     i[x,0]:=0 ; f[x,0]:=0 ;
                   end;
  for x:=0 to b do f[0,x]:=0;
  for x:=1 to b do begin
                     f[1,x]:=trunc(x/w[1])*t[1] ;
                     if f[1,x]=0 then i[1,x]:=0 else i[1,x]:=1 ;
                   end;
  count:=1 ; executa(i,w,f,t,b,n,count);
  repeat until keypressed ;
end.

