Cod sursa(job #1056271)

Utilizator Master011Dragos Martac Master011 Data 14 decembrie 2013 12:49:19
Problema Energii Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 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 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,sum2=0; fscanf(in,"%d%d",&G,&W);
    for(int i = 1 ; i <= G; ++i){
        fscanf(in,"%d%d",&P[i],&C[i]);
        sum+=P[i];
        sum2+=C[i];
    }
    if(sum<W){
        fprintf(out,"-1\n");
        CLOSE
    }
    int sol=MAX_M;
    for(int i = 1 ; i <= G ; ++i){
        for(int j = 1 ; j <= 20000; ++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>j && 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>j && mat[1][j]>=W)
                    sol=j;
            }
        }
    }
    fprintf(out,"%d\n",sol);
    CLOSE
}