Pagini recente » Borderou de evaluare (job #605806) | Cod sursa (job #1241915) | Cod sursa (job #212799) | Cod sursa (job #1909989) | Cod sursa (job #68044)
Cod sursa(job #68044)
#include<stdio.h>
#include<stdlib.h>
FILE *f=fopen("energii.in","r"), *g=fopen("energii.out","w");
struct nod {int cant,cost;} a[1024];
int n,w,i,j,ok;
long long s1[20005],s2[20005],min;
int comp(nod *a, nod *b)
{
if(a->cant > b->cant) return 1;
else if(a->cant == b->cant) if(a->cost > b->cost) return 1;
return -1;
}
int main()
{
fscanf(f,"%d %d",&n,&w);
for(i=1;i<=n;i++) fscanf(f,"%d %d",&a[i].cant,&a[i].cost);
fclose(f);
qsort(a+1,n,sizeof(nod),(int (*)(const void *, const void *))comp);
for(i=1;i<=n;++i)
{
s2[a[i].cant]=a[i].cost;
for(j=15000;j>=1;--j)
if(s1[j])
{
s2[j+a[i].cant]=s1[j]+a[i].cost;
if(j+a[i].cant>=w) ok=1;
}
for(j=1;j<=15000;j++)
if(s2[j]<s1[j]||!s1[j])
s1[j]=s2[j];
}
if(!ok) fprintf(g,"-1\n");
else {
min=0x3f3f3f3f;
for(i=w;i<=15000;i++)
if(s1[i]!=0&&s1[i]<min) min=s1[i];
fprintf(g,"%d\n",min);
}
fclose(g);
return 0;
}