Cod sursa(job #1175507)

Utilizator AnduuFMI Alexandru Banu Anduu Data 24 aprilie 2014 20:29:04
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <cstdio>
#include <climits>
using namespace std;
int a[1005][5005], e[1005], c[1005], En, n;

void read () {

    FILE *in = fopen ("energii.in", "r");
    fscanf (in, "%d%d", &n, &En);
    for (int i = 1; i <= n; ++i)
        fscanf (in, "%d%d", &e[i], &c[i]);
    fclose (in);
}

int exist (int i, int j, int E) {

    if (j - E < 0)
        return 0;
    if (a[i - 1][j - E] == INT_MAX)
        return 0;
    return j;
}

int min (int a, int b) {

    if (a < b)
        return a;
    return b;
}

int main()
{
    int b;
    read ();
    for (int i = 1; i <= En; ++i)
        a[0][i] = INT_MAX;
    for (int i = 1; i <= n; ++i)
        for (int j = 1; j <= En; ++j)
            if (e[i] < j && e[i] + exist(i, j, e[i]) < j)
                a[i][j] = INT_MAX;
            else {
                if (j - e[i] < 0)
                    b = c[i];
                else b = c[i] + a[i - 1][j - e[i]];
                a[i][j] = min (a[i - 1][j], b);
            }

    FILE *out = fopen ("energii.out", "w");
    if (a[n][En] == INT_MAX)
        fprintf (out, "-1");
    else fprintf (out, "%d", a[n][En]);
    fclose (out);
    return 0;
}