Cod sursa(job #2444804)

Utilizator alex.cojocaruAlex Cojocaru alex.cojocaru Data 1 august 2019 14:50:33
Problema Energii Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <iostream>

#define GMAX 1001
#define WMAX 10001
#define INFINIT 1000000000

using namespace std;

struct gen {
  int e ;
  int cst ;
};

struct sol {
  char s [ GMAX + 1 ] ;
  int pret ;
};

gen v [ GMAX + 1 ] ;
sol gr [ WMAX + 1 ] ;

int main() {

  FILE *fin, *fout ;
  fin = fopen ("energii.in", "r" ) ;
  fout = fopen ("energii.out", "w" ) ;
  int g, w, i, j, poz, minim ;
  fscanf (fin, "%d%d", &g, &w ) ;
  for (i = 0 ; i <= WMAX ; i++ )
    gr[i].pret = INFINIT ;
  for (i = 1 ; i <= g ; i++ ) {
    fscanf (fin, "%d%d", &v[i].e, &v[i].cst ) ;
    gr[v[i].e].pret = v[i].cst ;
    gr[v[i].e].s[i] = 1 ;
  }
  for (i = 0 ; i <= WMAX ; i++ ) {
    if (gr[i].pret != INFINIT ) {
      for (j = 1 ; j <= g ; j++ ) {
        if (i+v[j].e <= WMAX && gr[i].s[j] == 0 && gr[i+v[j].e].pret > gr[i].pret + v[j].cst ) {
          gr[i+v[j].e] = gr[i] ;
          gr[i+v[j].e].pret += v[j].cst ;
          gr[i+v[j].e].s[j] = 1 ;
        }
      }
    }
  }
  poz = 0 ;
  minim = INFINIT ;
  for (i = w ; i <= WMAX ; i++ )
    if (gr[i].pret != INFINIT && gr[i].pret < minim ) {
      minim = gr[i].pret ;
      poz = i ;
    }
  if (poz == 0 )
    fprintf (fout, "-1" ) ;
  else {
    fprintf (fout, "%d", gr[poz].pret ) ;
  }
  return 0;
}