Pagini recente » Cod sursa (job #1834466) | Cod sursa (job #1493527) | Cod sursa (job #1597874) | Cod sursa (job #1821962) | Cod sursa (job #1056093)
#include<cstdio>
#define MAX_M 30000
#define MAX_N 1001
#define CLOSE fclose(in); fclose(out); return 0;
using namespace std;
int mat[3][MAX_M],C[MAX_N],P[MAX_N];
inline int min (int a , int b){
return a<b?a:b;
}
inline int max (int a, int b){
return a>b?a:b;
}
int main (){
FILE *in=fopen("energii.in","r");
FILE *out=fopen("energii.out","w");
int G,W,sum=0; fscanf(in,"%d%d",&G,&W);
for(int i = 1 ; i <= G; ++i){
fscanf(in,"%d%d",&P[i],&C[i]);
sum+=C[i];
}
if(sum<W){
printf("-1\n");
CLOSE
}
int lim = min(MAX_M-1,sum),sol=-1;
for(int i = 1 ; i <= G ; ++i){
for(int j = 1 ; j <= lim ; ++j){
if(i%2==0){
if(j>=C[i])
mat[2][j]=max(mat[1][j],P[i]+mat[1][j-C[i]]);
else
mat[2][j]=mat[1][j];
if(sol==-1 && mat[2][j]>=W)
sol=j;
}
else{
if(j>=C[i])
mat[1][j]=max(mat[2][j],P[i]+mat[2][j-C[i]]);
else
mat[1][j]=mat[2][j];
if(sol==-1 && mat[1][j]>=W)
sol=j;
}
}
}
fprintf(out,"%d\n",sol);
CLOSE
}