Cod sursa(job #349420)

Utilizator PetreanuMirceaPetreanu Mircea PetreanuMircea Data 19 septembrie 2009 13:52:36
Problema Energii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <iostream>
using namespace std;
int main() {
    int g, w, e[100], c[100], uz[100][100], cost[100];
    int i, j, k, min=99999, max=0, t;
    FILE *in=fopen("energii.in", "r"), *out=fopen("energii.out", "w");
    //citesc datele de intrare
    fscanf(in, "%d%d", &g, &w);
    for(i=1; i<=g; i++) {
             fscanf(in, "%d%d", &e[i], &c[i]);
             //stabilesc minimul costurilor
             if(c[i]<min) {
                          min=c[i];
                          t=i;
             }
             //stabilesc suma costurilor
             max+=c[i];
    }
    for(i=1; i<min; i++) {
             cost[i]=0;
             for(j=1; j<=g; j++) {
                      uz[i][j]=0;
             }
    }
    //setez cost/uz pentru minim
    cost[min]=min;
    uz[min][t]=1;
    //incepere algoritm
    for(j=min+1; j<max; j++) {
                 cost[j]=999999;
                 //incerc sa obtin cost[j]
                 for(i=1; i<=g; i++) {
                          //iau fiecare e[i] in parte
                          if(j-e[i]>0 && uz[j-e[i]][i]==0) {
                                      //cost[j]=cost[j-e[i]]+c[i]
                                      if(cost[j-e[i]]+c[i]<cost[j]) {
                                            cost[j]=cost[j-e[i]]+c[i];
                                            for(k=1; k<=g; k++) {
                                                     uz[j][k]=uz[j-e[i]][k];
                                            }
                                            uz[j][i]=1;
                                      }
                          }
                 }
    }
    min=999999;
    for(j=w; j<max; j++) {
             //calculez minimul
             if(cost[j]<min) {
                             min=cost[j];
             }
    }
    fprintf(out, "%d", min);
    fclose(in); fclose(out);
    return 0;
}