Cod sursa(job #124124)

Utilizator filipbFilip Cristian Buruiana filipb Data 18 ianuarie 2008 11:53:08
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <stdio.h>

#define minim(a, b) ((a < b) ? a : b)
#define INF 2000000001

int N, W;
int D[2][5005];

int main(void)
{
    int i, j, e, cost, crt, prev;
    
    freopen("energii.in", "r", stdin);
    freopen("energii.out", "w", stdout);

    scanf("%d", &N);
    scanf("%d", &W);
    
    for (i = 1; i <= W; i++)
        D[0][i] = INF;
    D[0][0] = 0;
    
    for (i = 1; i <= N; i++)
    {
        scanf("%d %d", &e, &cost);
        
        crt = (i % 2); prev = !crt;
        for (j = W; j >= 1; j--)
        {
            D[crt][j] = INF;
            if (j == W)
            {
                D[crt][j] = D[prev][j];
                if (j >= e)
                    D[crt][j] = minim(D[crt][j], D[prev][j-e]+cost);
            }
            else
            {
                D[crt][j] = minim(D[crt][j+1], D[prev][j]);
                if (j >= e)
                    D[crt][j] = minim(D[crt][j], D[prev][j-e]+cost);
            }
            
        }
        
    }

    if (D[crt][W] == INF)
        D[crt][W] = -1;
        
    printf("%d\n", D[crt][W]);

    return 0;
}