Cod sursa(job #185923)

Utilizator blue_phoenixPosea Elena blue_phoenix Data 26 aprilie 2008 13:28:28
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.08 kb
#include <stdio.h>   
#define nmax 1005   
#define wmax 5005   
#define infinit 1000000000   
  
int N, W;   
  
int E[nmax], C[nmax], S[nmax], CMIN[nmax][wmax];   
  

void date()   
{   
    int i;   
  
    freopen("energii.in", "r", stdin);   
  
    scanf("%d%d", &N, &W);   
  
    for (i = 1; i <= N; ++i)   
        scanf("%d%d", &E[i], &C[i]);   
}   
  

void afisaza()   
{   
    freopen("energii.out", "w", stdout);   
  
    if (CMIN[N][W] < infinit)   
        printf("%d\n", CMIN[N][W]);   
    else  
        printf("-1\n");   

/*int i,j;
for(i=0;i<=N;i++)
 {
  for(j=0;j<=W;j++)
  if(CMIN[i][j]==infinit)printf("* ");
  else printf("%d ",CMIN[i][j]);
  printf("\n");
 }
 printf("\n");
*/
}   



void rezolva()   
{   
    int i, w;   
    
    S[0]=0;
    //printf("Sirul S care contine sume partiale este:\n");
    for (i = 1; i <= N; ++i)S[i] = S[i-1] + E[i];//printf("%d ",S[i]); }  
    //printf("\n");
    for (w = 1; w <= W; ++w)CMIN[0][w] = infinit;   
  
    
    for (i = 1; i <= N; ++i)   
      {   
         for (w = 1; w <= W && w <= S[i]; ++w)   
           {   
               CMIN[i][w] = infinit;   
   //REGULA 1
               if (CMIN[i-1][w] < CMIN[i][w])//daca inainte nu a fost infinit
                           //{
                                CMIN[i][w] = CMIN[i-1][w];
                           //printf("Am pus %d  pe locul %d %d (adica ce e si de-asupra) conform regulii 1,fiindca inainte nu a fost infinit\n",CMIN[i-1][w],i,w);write();}   
    
  //REGULA 2           
               if (E[i] >= w)//daca energia curenta e suficienta,pentru cat mi-am propus sa ating(w)   
                 {   
                   //si, in plus costul curent este mai mare decat costul dat la intrare
                   if (CMIN[i][w] > C[i])   
                      // {
                      CMIN[i][w] = C[i];
                      //printf("Am pus %d pe locul %d %d conform regulii 2;energia curenta(%d) e sufic pt energia propusa(%d)\n",C[i],i,w,E[i],w);write();}//in matrice incerc sa am costuri minime, energii maxime   
                 }   
   
  //REGULA 3        
               if (E[i] <= w)   
                 //{   
                    //daca energia  curenta nu e suficienta
                    if (CMIN[i][w] > C[i] + CMIN[i-1][w-E[i]])   
                        //printf("\n");
                        CMIN[i][w] = C[i] + CMIN[i-1][w-E[i]];   
                        //printf("Sunt la linia i=%d coloana w=%d regula 3;w-E[i]=%d-E[%d]=%d-%d\n",i,w,w,i,w,E[i]);
                        //printf("REGULA 3: am pus CMIN[i][w]=%d",CMIN[i][w],w-E[i]);
                        //si, in plus,costul curent  propuse mai mare decat costul de intrare+
                        //???? 
                        //write();
                 //}   
          }   
         for (w = S[i]+1; w <= W; ++w)   
             CMIN[i][w] = infinit;   
     }   
}   
  
  
int main()   
{   
freopen ("energii.out","w",stdout);
    date();   
  
    rezolva();   
  
    afisaza();   
  
    return 0;   
}