HUGEKNAP - Cái túi ( Hard version )

Tác giả: flashmt

Ngôn ngữ: Pascal

const fi='';
      fo='';
      maxn=10001;
var n,re,s,test,it:longint;
    w,v,res:array[1..maxn] of longint;
    f:array[0..1,0..1000] of longint;
    tr:array[0..maxn,0..1000] of boolean;

procedure rf;
var i:longint;
begin
     read(n,s);
     for i:=1 to n do read(w[i]);
     for i:=1 to n do read(v[i]);
end;

procedure pr;
var i,j,z:longint;
begin
     fillchar(f,sizeof(f),0);
     for i:=1 to n do
     begin
          z:=i and 1;
          for j:=0 to w[i]-1 do 
          begin
               f[z,j]:=f[1-z,j];
               tr[i,j]:=false; 
          end;
          for j:=w[i] to s do
              if f[1-z,j]<f[1-z,j-w[i]]+v[i] then
              begin
                   f[z,j]:=f[1-z,j-w[i]]+v[i];
                   tr[i,j]:=true;
              end
              else
              begin
                   f[z,j]:=f[1-z,j];
                   tr[i,j]:=false;
              end;
     end;
end;

procedure wf;
var i,j,dem,jj:longint;
begin
     re:=0;
     for jj:=0 to s do
         if f[n and 1,jj]>re then
         begin
              re:=f[n and 1,jj];
              j:=jj;
         end;
     dem:=0; i:=n;
     while j>0 do
     begin
          if tr[i,j] then
          begin
               dem:=dem+1;
               res[dem]:=i;
               j:=j-w[i];
          end;
          dec(i);
     end;
     writeln(re,' ',dem);
     for j:=dem downto 1 do write(res[j],' ');
     writeln;
end;

begin
     assign(input,fi); reset(input);
     assign(output,fo); rewrite(output);
     read(test);
     for it:=1 to test do
     begin
          rf;
          pr;
          wf;
     end;
     close(input); close(output);
end.




Download