Cod sursa(job #460184)
#include<stdio.h>
#define INF 2000000000;
long gen,w,nr,c[1001][5001],cost[1001],energie[1001];
long int divide(int i, int j){
long int min,l;
if(j<=0)return 0;//am atins/depasit energia de care aveam nevoie
if(i==0)return INF;
if(c[i-1][j]==-1){
c[i-1][j]=divide(i-1,j);
}
c[i][j]=c[i-1][j];
l=divide(i-1,j-energie[i])+cost[i];
if(l<c[i][j])c[i][j]=l;
return c[i][j];
}
int main(){
int i,j;
FILE *fin=fopen("energii.in","r");
FILE *fout=fopen("energii.out","w");
fscanf(fin,"%ld%ld",&gen,&w);
for(i=1;i<=gen;i++)
fscanf(fin,"%ld%ld",&energie[i],&cost[i]);
for(i=0;i<=gen;i++)
for(j=0;j<=w;j++)
c[i][j]=-1;
c[gen][w]=divide(gen,w);
/*for(i=1;i<=gen;i++){
for(j=1;j<=w;j++)
printf("%ld ", c[i][j]);
printf("\n");
}*/
if(c[gen][w]<2000000000)fprintf(fout,"%ld",c[gen][w]);
else fprintf(fout,"-1\n");
return 0;
}