Pagini recente » Cod sursa (job #365929) | Cod sursa (job #2020625) | Cod sursa (job #2697975) | Cod sursa (job #1983618) | Cod sursa (job #1667104)
#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
*/