Cod sursa(job #761664)

Utilizator warchildmdMihail Burduja warchildmd Data 26 iunie 2012 22:38:52
Problema Energii Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
#define INF 2000000000

int G, W;

int E[1024];
int C[1024];
int dp[1024][5005];

inline int min(int x, int y)
{
    if (x < y)
    {
        return x;
    }
    return y;
}

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", &E[i], &C[i]);
    }

    for (int i = 0; i <= G; i++)
    {
        for (int j = 0; j <= W + 3; j++)
        {
            dp[i][j] = INF;
        }
    }

    int mini = INF;
    dp[0][0] = 0;

    for (int i = 0; i < G; i++)
    {
        for (int j = 0; j < W; j++)
        {
            if (dp[i][j] < INF)
            {
                if ((dp[i][j] + C[i + 1]) < dp[i + 1][min(j + E[i + 1], W + 2)])
                {
                    dp[i + 1][min(j + E[i + 1], W + 2)] = (dp[i][j] + C[i + 1]);
                    if (j + E[i + 1] >= W)
                    {
                        mini = min(mini, dp[i + 1][min(j + E[i + 1], W + 2)]);
                    }
                }
                if ((dp[i][j]) < dp[i + 1][j])
                {
                    dp[i + 1][j] = dp[i][j];
                }
            }
        }
    }

    printf("%d\n", mini);

    return 0;
}