Cod sursa(job #1667104)

Utilizator TincaMateiTinca Matei TincaMatei Data 28 martie 2016 17:38:47
Problema Energii Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <stdio.h>
#define MAX_N 1000
#define MAX_E 10000
#define INFINIT 1000000000

int rucsac[ 1 + MAX_E ];

//minim dintre a si b
int min( int a , int b ) {
  if( a < b )
    return a;
  else
    return b;
}

int main() {
  int n , w , i , cost , e , j , s , rez;
  FILE *fin = fopen( "energii.in" , "r" );
  
  fscanf( fin , "%d%d" , &n , &w );
  
  //initializam rucsacul cu INFINIT
  for( i = 1 ; i <= MAX_E ; i++ )
    rucsac[ i ] = INFINIT;
  
  s = 0;
  rez = INFINIT;
  for( i = 0 ; i < n ; i++ ) {
    fscanf( fin , "%d%d" , &e , &cost );
    s = min( s + e , MAX_E ); //calculam suma noua
    for( j = s ; j >= e ; j-- )
      if( j >= e ) //aplicam recurenta
        rucsac[ j ] = min( rucsac[ j ] , rucsac[ j - e ] + cost );
    
    //cautam costul minim
    for( j = w ; j <= s ; j++ )
      rez = min( rez , rucsac[ j ] );
  }
  
  fclose( fin );

  FILE *fout = fopen( "energii.out" , "w" );
  if( rez == INFINIT )
    fprintf( fout , "-1" );
  else
    fprintf( fout , "%d" , rez );
  fclose( fout );
  return 0;
}

/*

recurenta: rucsac[ N ][ E ] = costul minim folosind primele N generatoare si energie E

rucsac[ N ][ E ] = min( rucsac[ N - 1 ][ E ] , rucsac[ N - 1 ][ E - cost ] + cost )
                  daca E >= cost
                 = rucsac[ N - 1 ][ E ]

optimizare: putem folosi doar o rucsac[ E ] si nu depasim memorie

*/