Cod sursa(job #1797749)

Utilizator Dupree7FMI Ciobanu Andrei Dupree7 Data 4 noiembrie 2016 18:40:54
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <fstream>

using namespace std;

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

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

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

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];

    a[G][W] = 0;

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

            if(e[i - 1] >= W && a[G][W] != 0)
                a[G][W] = minim(a[G][W], 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];


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

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

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