Cod sursa(job #1164156)

Utilizator mvcl3Marian Iacob mvcl3 Data 1 aprilie 2014 21:37:10
Problema Energii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include <fstream>
#include <vector>

#define in "energii.in"
#define out "energii.out"
#define Max_E 10000
#define oo 100000000

typedef std :: pair < int , int > CENTRALE;

std :: ifstream f(in);
std :: ofstream g(out);

class Energii {
    public :
        bool Is_It_Valid(std :: vector < CENTRALE >, int );
        int Solve(std :: vector < CENTRALE > , int);
};

bool Energii :: Is_It_Valid(std :: vector < CENTRALE > V, int W) {
    int sum = 0;
    for(int i = 0;i < V.size(); ++i)    sum += V[i].first;

    if(sum < W) return 0;
    return 1;
}

int Energii :: Solve(std :: vector < CENTRALE > V, int W) {
    std :: vector < int > DP(Max_E + W + 1, oo);
    DP[0] = 0;
    int best_sol = oo;

    for(int i = 0; i < V.size(); ++i)
        for(int j = W; j >= 0; --j)
            if(DP[j] != -1 && DP[j + V[i].first] > DP[j] + V[i].second)
                DP[j + V[i].first] = DP[j] + V[i].second;

    for(int i = W; i < DP.size(); ++i)
        if(DP[i] != oo && DP[i] < best_sol) best_sol = DP[i];

    return best_sol;
}

int main() {
    int N, G;

    f >> N >> G;
    std :: vector < CENTRALE > V(N);
    for(int i = 0; i < N; ++i)  f >> V[i].first >> V[i].second;

    Energii obj;
    if(!obj.Is_It_Valid(V, G))  g << "-1\n";
    else                        g << obj.Solve(V, G) << '\n';
}