Cod sursa(job #239736)
#include <stdio.h>
#include <stdlib.h>
int n,w,add[15002],t[15002],enrg[15002],e[1001],c[1001];
int pass[1001];
bool ok[40401];
FILE *f=fopen("energii.in","r");
FILE *g=fopen("energii.out","w");
void parcurge(int poz){
int i=poz,nr=1;
pass[add[i]]=poz;
while (t[i]!=-1) {
i=t[i];
pass[add[i]]=poz;
nr++;
}
}
void writeit(int cost){
fprintf(g,"%d\n",cost);
fclose(f);
fclose(g);
exit(0);
}
int main (int argc,char *argv[]) {
fscanf(f,"%d",&n);
fscanf(f,"%d",&w);
int i;
int s=0;
for (i=0; i<n; i++) {
fscanf(f,"%d %d",&e[i],&c[i]);
if ((!ok[c[i]]) || (e[i]>enrg[c[i]])) {
enrg[c[i]]=e[i];
add[c[i]]=i;
t[c[i]]=-1;
ok[c[i]]=1;
if (enrg[c[i]]>=w) {
writeit(c[i]);
}
}
if (s<w) {
s+=e[i];
}
}
if (s<w) {
writeit(-1);
}
int j;
for (i=1; i<=w+10001; i++) {
if (ok[i]) {
parcurge(i);
for (j=0; j<n; j++) {
if (pass[j]!=i) {
if ((!ok[i+c[j]]) || (enrg[i]+e[j]>enrg[i+c[j]])) {
enrg[i+c[j]]=enrg[i]+e[j];
add[i+c[j]]=j;
t[i+c[j]]=i;
ok[i+c[j]]=1;
if (enrg[c[j]+i]>=w) {
writeit(c[j]+i);
}
}
}
}
}
}
fclose(f);
fclose(g);
return 0;
}