Cod sursa(job #938155)

Utilizator mvcl3Marian Iacob mvcl3 Data 11 aprilie 2013 21:52:38
Problema Energii Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <fstream>
#include <cstring>
#define NMAX 1009
#define GMAX 10009
using namespace std;

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

int N, S, G[NMAX], P[NMAX];
int DP[GMAX];

inline void read_Data() {

    f >> N >> S;

    for(int i = 1; i <= N; ++i) f >> P[i] >> G[i];
}

inline void solve() {
    int minim = 9999999999999;
    memset(DP, -1, sizeof(DP));

    DP[0] = 0;

    for(int i = 1; i <= N; ++i)
        for(int j = S; j >= 0; --j)
            if(DP[j] != -1){
                if(j + P[i] > S)
                    if(G[i] + DP[j] < minim)
                        minim = DP[j] + G[i];

                if(j + P[i] <= S)
                    if(DP[j] + G[i] > DP[j + P[i]] || DP[j + P[i]] == -1)
                       DP[j + P[i]] = DP[j] + G[i];
            }

    if(DP[S] == -1 && minim == 9999999999999) g << "-1\n";
    else    {
        if(DP[S] == -1) g << minim << '\n';
        else            g << min(minim, DP[S]);
    }

}

int main() {

    read_Data();
    solve();

    g.close();
    return 0;
}