Cod sursa(job #1056093)

Utilizator Master011Dragos Martac Master011 Data 14 decembrie 2013 12:30:46
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#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
}