Cod sursa(job #261935)

Utilizator ProcopliucProcopliuc Adrian Procopliuc Data 18 februarie 2009 21:22:31
Problema Energii Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.9 kb
# include <stdio.h>
int a[10000],b[10000],c[20000],d[20000],i,j,min,n,w,s,aux;
int main ()
{
freopen ("energii.in","r",stdin);
freopen ("energii.out","w",stdout);
scanf ("%i%i",&n,&w);
for (i=0;i<n;i++)
{
scanf ("%i%i",&a[i],&b[i]);
s=s+a[i];
}
if (s<w)
printf ("-1");
else
{
if (s>11000)
s=11000;
 for (i=0;i<n-1;i++)
for (j=i+1;j<n;j++)
if (a[i]>a[j])
{
aux=a[i];
a[i]=a[j];
a[j]=aux;
aux=b[i];
b[i]=b[j];
b[j]=aux;
}


for (i=0;i<n;i++)
{
if (c[a[i]]==0)
{
c[a[i]]=2;
d[a[i]]=b[i];
}
else
if (d[a[i]]>b[i])
{
c[a[i]]=2;
d[a[i]]=b[i];
}


for (j=0;j<=s;j++)

if (c[j]==1)
if (c[j+a[i]]==0)
{
c[j+a[i]]=2;
d[j+a[i]]=d[j]+b[i];
}
else
if (d[j+a[i]]>d[j]+b[i])
{
c[j+a[i]]=2;
d[j+a[i]]=d[j]+b[i];

}

for (j=0;j<=s;j++)
if (c[j]==2)
c[j]=1;

}

min=30000000;
for (i=w;i<=s;i++)
if (c[i]==1)
if (d[i]<min)
min=d[i];
printf ("%i",min);
}

return 0;
}