Cod sursa(job #141223)

Utilizator yonutzTalos Ionut yonutz Data 22 februarie 2008 21:22:01
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <cstdio>     
     
#define GM 1010     
#define WM 5010     
#define inf 2000000000     
     
long a[WM];     
int v[WM], c[WM];     
int g, w;     
     
int main()     
{     
    freopen("energii.in","r",stdin);     
    freopen("energii.out","w",stdout);     
     
    scanf("%d", &g);     
    scanf("%d", &w);     
     
    for (int i=1; i<=g; ++i)     
    scanf("%d%d", &v[i], &c[i]);     
    for (int i=1; i<=w; ++i)     
    a[i]=inf;     
    a[0]=0;     
    long min=inf;     
/*     
    for (int i=1; i<=g; ++i)   
    for (int j=0; j<=w; ++j)   
    {   
        if (v[i]>=w && min>c[i]) min=c[i];   
        else if (v[i]+j<=w)   
        {   
        if (a[v[i]+j]>a[j]+c[i]) a[v[i]+j]=a[j]+c[i];   
        }    
        if (j+v[i]>=w && min>a[j]+c[i]) min=a[j]+c[i];   
    }   
*/     
     
    for (int i=1; i<=g; ++i)       
    {       
        for (int j=w; j>=1; --j)       
        {       
            if (j+v[i]<w && a[j+v[i]]>a[j]+c[i]) a[j+v[i]]=a[j]+c[i];       
            if (j+v[i]>=w && a[j]+c[i]<min) min=a[j]+c[i];       
        }       
       
        if (v[i]>=w && c[i]<min) min=c[i];       
        if (v[i]<w && c[i]<a[v[i]]) a[v[i]]=c[i];       
    }       
     
    if (min==inf) printf("-1\n");     
    else printf("%ld\n", min);     
     
    fclose(stdin);     
    fclose(stdout);     
     
    return 0;     
}