Cod sursa(job #129798)

Utilizator TociToxAnonim Anonim TociTox Data 30 ianuarie 2008 11:20:08
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include "stdio.h"   
#define INF 2000000001   
  
FILE *fin=freopen("energii.in","r",stdin);   
FILE *fout=freopen("energii.out","w",stdout);   
  
int g,w,x[1001],c[1001],f[1001][5001],min;   
void citeste()   
{   
    scanf("%d%d",&g,&w);   
    for(int i=1;i<=g;i++)   
    {   
        scanf("%d%d",&x[i],&c[i]);   
    }   
    fclose(fin);   
    for (int i = 1; i <= w; i++)   
        f[0][i] = INF;   
    f[0][0] = 0;   
}   
void rezolva()   
{   
    int i,j;   
    int imin=0;   
    int crt,prev;   
  
    for(i=1;i<=g;i++)   
    {   
        crt=i; prev=i-1;   
        for(j=w;j>=1;j--)   
        {   
            f[crt][j]=INF;   
            if(j==w){   
             if(x[i]<=j && c[i]+f[prev][j-x[i]]<f[prev][j])   
             {   
                    f[crt][j]=c[i]+f[prev][j-x[i]];    
             }else f[crt][j]=f[prev][j];   
            }   
            else    
            {   
                if(f[prev][j]>f[crt][j+1]) f[crt][j]=f[crt][j+1];   
                else f[crt][j]=f[prev][j];   
                   
                if(x[i]<=j && c[i]+f[prev][j-x[i]]<f[crt][j])   
                {   
                    f[crt][j]=c[i]+f[prev][j-x[i]];    
                }   
            }   
        }   
    }   
}   
void afiseaza()   
{   
    if(f[g][w]!=INF)   
    printf("%d",f[g][w]);   
    else printf("-1");   
    fclose(fout);   
}   
  
int main()   
{   
    citeste();   
    rezolva();   
    afiseaza();   
    return 0;   
}