Cod sursa(job #141101)

Utilizator SycronVene Tian Sycron Data 22 februarie 2008 19:07:36
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 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;   
}