Cod sursa(job #1718241)

Utilizator denniscrevusDennis Curti denniscrevus Data 17 iunie 2016 04:45:41
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.18 kb
#include <cstdio>
#include <algorithm>

#define WMAX 5007
#define inf 1000000007

using namespace std;
FILE *fin, *fout;
int g, w, e, c, dp[2][WMAX];

void citire()
{
    for(int i = 1; i< WMAX; ++i)
    {
        dp[0][i] = inf;
        dp[1][i] = inf;
    }
    dp[0][0] = 0;
    dp[1][0] = 0;
    scanf("%d %d", &g, &w);
    for(int i = 1; i<= g; ++i)
    {
        scanf("%d %d", &e, &c);
        int line = (int)(i&1), prev = !line;
        for(int j = 1; j< WMAX; ++j) dp[line][i] = inf;
        for(int j = 0; j<= w; ++j)
        {
            dp[line][j] = dp[prev][j];
            if(j - e >= 0)
            {
                dp[line][j] = min(dp[prev][j], dp[prev][j-e] + c);
            }
            else dp[line][j] = min(dp[prev][j], c);
        }
        //for(int j = 0; j<= w; ++j) printf("%d ", (dp[line][j] == inf)?-1:dp[line][j]); printf("\n");
    }
}
void afisare()
{
    if(dp[g&1][w] >= inf) printf("-1\n");
    else printf("%d\n", dp[g&1][w]);
}

int main()
{
    fin = freopen("energii.in", "r", stdin);
    fout = freopen("energii.out", "w", stdout);
    citire();
    afisare();
    fclose(fin);
    fclose(fout);
    return 0;
}