Cod sursa(job #880508)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 16 februarie 2013 20:55:37
Problema Energii Scor 95
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <iostream>
#include <fstream>

using namespace std;

#define Nmax 30002

int G, W, S;
int E[Nmax], C[Nmax], cost[Nmax];
bool format[Nmax];
int minim = Nmax*Nmax;

void citire(){

    ifstream f("energii.in");

    f >> G >> W;

    for(int i = 1; i <= G; i++)
        f >> E[i] >> C[i],
        S += E[i];

    f.close();
}

void dinamica(){

    int maxim = 0, poz;
    format[0] = 1;

    for(int i = 1; i <= G; i++){

        for(int j = maxim; j >= 0; j--)
            if(format[j]){

                format[j+E[i]] = 1;

                if(cost[j] + C[i] < cost[j+E[i]] || cost[j+E[i]] == 0)
                    cost[j+E[i]] = cost[j] + C[i];

                if(j+E[i] >= W && cost[j+E[i]] < minim)
                    minim = cost[j+E[i]],
                    poz = j+E[i];
            }

        if(cost[maxim] + C[i] < minim)
            maxim += E[i];
    }
}

void afis(){

    ofstream g("energii.out");

    if(W > S)
        g << -1;
    else
        g << (minim == Nmax*Nmax ? -1 : minim) << "\n";
}

int main(){

    citire();
    dinamica();
    afis();

    return 0;
}