Pagini recente » Cod sursa (job #66682) | Cod sursa (job #218225) | Cod sursa (job #906884) | Cod sursa (job #1734657) | Cod sursa (job #5665)
Cod sursa(job #5665)
var f:text;
n,w,i,cost,poz,k:integer;
e,c,p:array[1..100] of integer;
optim:boolean;
procedure q_sort(st,dr:integer);
var i,j,aux:integer;
begin i:=st;j:=dr;
while i<>j do
begin if ((i-j)*(c[i]/e[i]-c[j]/e[j])<0)or((c[i]/e[i]=c[j]/e[j])and
((i-j)*(e[i]-e[j])>0)) then
begin aux:=c[i];c[i]:=c[j];c[j]:=aux;
aux:=e[i];e[i]:=e[j];e[j]:=aux;
aux:=i;i:=j;j:=aux;
end;
j:=j+abs(i-j) div (i-j);
end;
if i>2 then q_sort(st,i-1);
if i<n-1 then q_sort(i+1,dr);
end;
procedure back(k,w1,c1:integer);
var i,x:integer;
begin if (not optim)and(w1>=w) then
begin if c1<cost then cost:=c1;
if w1=w then optim:=true;
end;
if not optim then
begin x:=p[k];
if x>0 then begin w1:=w1-e[x];c1:=c1-c[x];end
else if w1<w then x:=p[k-1]
else x:=n;
for i:=x+1 to n do if not optim then
if (c1+c[i])/(w1+e[i])<=cost/w then
begin p[k]:=i;back(k+1,w1+e[i],c1+c[i]);end
else optim:=true;
end;
if (not optim)and(k<=poz) then
begin p[k]:=0;back(k-1,w1,c1);end;
end;
procedure greedy(k,w1,c1:integer);
var i:integer;
begin for i:=p[k-1]+1 to n do if not optim then
if w1+e[i]<w then
begin p[k]:=i;greedy(k+1,w1+e[i],c1+c[i]);break;
end
else if w1+e[i]=w then
begin optim:=true;cost:=c1+c[i];
end
else begin cost:=c1+c[i];p[k]:=i;poz:=i;
back(k,w1+e[i],cost);break;
end
else break;
end;
begin assign(f,'energii.in');reset(f);read(f,n,w);
for i:=1 to n do readln(f,e[i],c[i]);
close(f);
q_sort(1,n);
greedy(1,0,0);
assign(f,'energii.out');rewrite(f);writeln(f,cost);close(f);
end.