Cod sursa(job #1797796)

Utilizator Dupree7FMI Ciobanu Andrei Dupree7 Data 4 noiembrie 2016 19:08:39
Problema Energii Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 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)
                {
                    a[i][j] = (a[i - 1][j] == 0) ? c[i - 1] : minim(c[i - 1], a[i - 1][j]);
                }
                else if(e[i - 1] > j && e[i - 1] < W)
                {
                    if(a[i - 1][j - e[i - 1]] != 0)
                        a[i][j] = (a[i - 1][j] == 0) ? a[i - 1][j - e[i - 1]] + c[i - 1] : minim(a[i - 1][j - e[i - 1]] + c[i - 1], a[i - 1][j]);
                    else
                        a[i][j] = a[i - 1][j];
                }
                else
                {
                    if(a[i - 1][W] == 0)
                        a[i][W] = c[i - 1];
                    else
                        a[i][W] = minim(c[i - 1], a[i - 1][W]);
                }
            }
        }

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