Cod sursa(job #4503)

Utilizator hellraizerChiperi Matei hellraizer Data 5 ianuarie 2007 09:33:42
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <stdio.h>

#define N_MAX 10001
#define G_MAX 1001
#define INF 80000000

int w,g,v[N_MAX],eg[G_MAX],cg[G_MAX],max;

void citire(){
        FILE *fin=fopen("energii.in","r");
        fscanf(fin,"%d",&g);
        fscanf(fin,"%d",&w);
        for (int i=1;i<=g;i++)
               fscanf(fin,"%d %d",&eg[i],&cg[i]);
        for (int i=1;i<N_MAX;i++)
                v[i]=-1;
        fclose(fin);
}

void prelucrare(){
        int i,j;
        max=w;
        for (i=1;i<=g;i++){
                for (j=w;j>=1;j--)
                        if(v[j]!=-1){
                                if (v[j+eg[i]]!=-1)
                                        if (v[j+eg[i]]>v[j]+cg[i])
                                                v[j+eg[i]]=v[j]+cg[i];
                                        else;
                                else
                                        v[j+eg[i]]=v[j]+cg[i];
                                if (j+eg[i]>max)
                                        max=j+eg[i];
                        }
                if (v[eg[i]]!=-1)
                        if (v[eg[i]]>cg[i])
                                v[eg[i]]=cg[i];
                        else;
                else{
                        v[eg[i]]=cg[i];
                        if (eg[i]>max)
                                max=eg[i];
                }
        }
}

void afisare(){
        int i,min=INF;
        FILE *fout=fopen("energii.out","w");
        for (i=w;i<=max;i++)
                if (v[i]<min&&v[i]>=0)
                       min=v[i];
        if (min==INF)
                fprintf(fout,"-1\n");
        else
                fprintf(fout,"%d\n",min);
        fclose(fout);
}

int main(){
        citire();
        prelucrare();
        afisare();
        return 0;
}