Cod sursa(job #379576)
#include <stdio.h>
#include <cstring>
using namespace std;
int e[1003],c[1003], Smax,n,W;
int s[5000006],cs[5000006];
void citire()
{
FILE *fin=fopen("energii.in","r");
fscanf(fin,"%d %d",&n,&W);
Smax=0;
for (int i=1;i<=n;++i)
{fscanf(fin,"%d %d", &e[i], &c[i]); Smax+=e[i];}
fclose(fin);
}
int main()
{
citire();
FILE * fout=fopen("energii.out","w");
if (Smax<W) { fprintf(fout,"-1"); fclose(fout);return 0;}
memset(s,0,sizeof(s));
int i,j;
for (i=1;i<=n;++i) { s[e[i]]=i; cs[e[i]]=c[i];}
for (i=1;i<W;++i)
if (s[i])
{
for (j=s[i]+1;j<=n;++j)
{ int val=i+e[j], cval=cs[i]+c[j];
if (!s[val]){ s[val]=j; cs[val]=cval;}
else
if (s[val]>0 && cs[val]>cval) cs[val]=cval; else
if (s[val]>0 && cs[val]==cval && s[val]>j) s[val]=j;
}
}
int cmin=6000000;
for (i=W;i<=Smax;++i)
if (s[i])
if (cmin>cs[i]) cmin=cs[i];
fprintf(fout,"%d\n",cmin);
fclose(fout);
return 0;
}