Cod sursa(job #47450)

Utilizator Bluedrop_demonPandia Gheorghe Bluedrop_demon Data 3 aprilie 2007 18:36:31
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
// Problema energii
// Particularizare a problemei rucsac

#include <stdio.h>
#define NMAX        1001
#define WMAX        5001
#define MAXIM       100000

int G, W;
int E[NMAX], C[NMAX];
long CMin[WMAX], Uz[WMAX][NMAX];

int main()
{
    long suma = 0;
    long cost = 0;
    freopen( "energii.in", "rt", stdin );
             scanf( "%d", &G );
             scanf( "%d", &W );
             long i;
             for( i=1; i<=G; i++ )
                  {
                       scanf( "%d %d", &E[i], &C[i] );                       
                       suma += E[i];
                       cost += C[i];
                  }
    fclose( stdin );
        
    freopen( "energii.out", "wt", stdout );
             if( suma < W )
                 {
                      printf( "-1\n" );
                      fclose( stdout );
                      return 0;
                 }
             int S, k;
             
             for( S=1; S<=W; S++ ) CMin[S] = MAXIM;
             
             for( S=1; S<=W; S++ ) 
                  for( i=1; i<=G; i++ )
                       if( ( E[i]<=S ) && ( CMin[S-E[i]] != MAXIM ) && ( !Uz[S-E[i]][i] ) )
                           if( CMin[S] > C[i] + CMin[S-E[i]] )
                           {
                               CMin[S] = C[i] + CMin[S-E[i]];
                               for( k=1; k<=G; k++ ) Uz[S][k] = Uz[S-E[i]][k];
                               Uz[S][i] = 1;                           
                           }
             
             printf( "%ld\n", CMin[W] );
    fclose( stdout );
    return 0;
}