Cod sursa(job #2700060)

Utilizator mihaipriboimihailucapriboi mihaipriboi Data 26 ianuarie 2021 14:06:42
Problema Energii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.11 kb
// Mihai Priboi

#include <bits/stdc++.h>

#define MAXN 1000
#define MAXW 5000
#define MAXC 10000001

struct generator {
  int e, c;
} v[MAXN];

int rucsac[2][MAXW + 1];

int main() {
  FILE *fin, *fout;
  int n, w, i, j, poz;
  fin = fopen( "energii.in", "r" );

  fscanf( fin, "%d%d", &n, &w );
  for( i = 0; i < n; i++ )
    fscanf( fin, "%d%d", &v[i].e, &v[i].c );

  fclose( fin );

  // pointers pentru usurinta la schimbarea liniilor
  int *a, *b;
  a = rucsac[1];
  b = rucsac[0];

  // prima linie este precalculata inainte ca sa evitam cazuri speciale
  for( j = 1; j <= w; j++ )
    b[j] = v[0].e >= j ? v[0].c : -1;

  // problema rucsacului, pe fiecare pozitie costul minim pentru energia cel
  // putin egala cu j, folosind primele i generatoare
  for( i = 1; i < n; i++ ) {
    for( j = 1; j <= w; j++ ) {
      a[j] = b[j];

      poz = j - v[i].e;
      poz = poz < 0 ? 0 : poz;
      if( b[poz] >= 0 )
        a[j] = std::min( a[j] >= 0? b[j] : MAXC, b[poz] + v[i].c );
    }
    std::swap(a, b);
  }

  fout = fopen( "energii.out", "w" );
  fprintf( fout, "%d", b[w] );
  fclose( fout );
  return 0;
}