Cod sursa(job #87970)
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
int e, c;
} generator;
generator v[1005], b[1005];
int e[1000000], c[1000000], n, x, suma;
int cmp(const void*a, const void*b)
{
long int x=*(long int*)a, y=*(long int*)b;
if(v[x].c==v[y].c) return v[x].e-v[y].e;
else return v[x].c-v[y].c;
}
int main()
{
freopen("energii.in","r",stdin);
freopen("energii.out","w",stdout);
scanf("%d%d",&n,&x);
int i, j, min, ord[1009];
for (i=1; i<=n; i++)
{
scanf("%d %d",&v[i].e,&v[i].c);
suma+=v[i].e;
ord[i]=i;
}
if (suma<x){ printf("-1"); return 0;}
qsort(ord,n+1,sizeof(int),cmp);
for (i=1; i<=n; ++i)
{
b[i].e=v[ord[i]].e;
b[i].c=v[ord[i]].c;
}
e[0]=1;
int max=1;
for(i=1; i<=n; i++)
for (j=max; j>=0; j--)
if (e[j]==1)
{
e[j+b[i].e]=1;
c[j+b[i].e]+=b[i].c;
if (j+b[i].e>=max) max=j+b[i].e;
}
min=c[suma];
for (i=x; i<suma; i++)
if (c[i]<min && c[i]) min=c[i];
printf("%d",min);
return 0;
}