Cod sursa(job #141208)

Utilizator BuniakovskiNeguletu Octavian Buniakovski Data 22 februarie 2008 20:53:01
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 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;  
}