Cod sursa(job #1798596)

Utilizator Dupree7FMI Ciobanu Andrei Dupree7 Data 5 noiembrie 2016 12:17:35
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <fstream>
#include <limits.h>

using namespace std;

ifstream f("energii.in");
ofstream g("energii.out");

#define inf INT_MAX

int minim(unsigned int a, unsigned int b)
{
    return (a > b) ? b : a;
}

int Energii(int e[], int c[], int G, int W)
{
    int i, j;

    int **a = new int*[G + 1];
    for(i = 0; i < G + 1; i++)
        a[i] = new int[W + 1];

    for(i = 0; i < G + 1; i++)
        for(j = 0; j < W + 1; j++)
        {
            if(i == 0 || j == 0)
                a[i][j] = inf;
            else
            {
            if(e[i - 1] > j)
                a[i][j] = a[i - 1][j];
            else if(e[i - 1] == j)
                a[i][j] = minim(a[i - 1][j], c[i - 1]);
            else if(e[i - 1] < j)
                a[i][j] = minim(a[i - 1][j], a[i - 1][j - e[i - 1]] + c[i - 1]);
            }
        }

    int r = a[G][W];

    for(i = 0; i < G + 1; i++)
        delete[] a[i];
    delete[] a;

    return r;
}

int main()
{
    int G, W, i;

    f >> G >> W;

    int *e = new int[G + 1], *c = new int[G + 1];

    for(i = 0; i < G; i++)
            {
            f >> e[i] >> c[i];
            if(e[i] > W)
                e[i] = W;
            }


    int d = Energii(e, c, G, W);

    if(d == inf)
        g << -1;
    else
        g << d;

    delete[] e;
    delete[] c;
    return 0;
}