Cod sursa(job #3160771)

Utilizator RatebaSerbanescu Andrei Victor Rateba Data 25 octombrie 2023 02:27:13
Problema Energii Scor 45
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <fstream>

using namespace std;

ifstream fin("energii.in");
ofstream fout("energii.out");

// 1 < G < 1001
// 1 < W < 5001
// 0 ≤ EGi,CGi < 10001

const int MAX_ENERGIE = 5001;
const int MAX_GEN = 1001;
const int INF = -1;
const int NEFOL = -2;

struct t_gen {
    int energie;
    int cost;
};

int memo[MAX_GEN + 1][MAX_ENERGIE];

int dp_cost(int idx, int energie, t_gen gens[], int memo[][MAX_ENERGIE]) {
    if (energie <= 0) {
        return 0;
    }

    if (idx == 0) {
        return INF;
    }

    if (memo[idx][energie] != NEFOL) {
        return memo[idx][energie];
    }

    // cazul 1
    int cost_prev1 = dp_cost(idx - 1, energie, gens, memo);
    int cost_curr1 = cost_prev1;

    // cazul 2
    int new_energ = energie - gens[idx].energie;
    int cost_prev2 = dp_cost(idx - 1, new_energ, gens, memo);
    int cost_curr2 = cost_prev2 + gens[idx].cost;

    if (cost_prev1 == INF && cost_prev2 == INF) {
        memo[idx][energie] = INF;
        return memo[idx][energie];
    }

    if (cost_prev1 == INF) {
        memo[idx][energie] = cost_curr2;
        return memo[idx][energie];
    }

    if (cost_prev2 == INF) {
        memo[idx][energie] = cost_curr1;
        return memo[idx][energie];
    }

    memo[idx][energie] = min(cost_curr1, cost_curr2);
    return memo[idx][energie];
}

int main() {

    int nr_gen;
    int max_energie;
    t_gen gens[MAX_GEN + 1];

    fin >> nr_gen >> max_energie;

    for (int i = 1; i <= nr_gen; i++) {
        int energie;
        int cost;

        fin >> energie >> cost;

        t_gen energ_cost = {energie, cost};
        gens[i] = energ_cost;
    }

    for (int i = 1; i <= nr_gen; i++) {
        for (int j = 0; j <= max_energie; j++) {
            memo[i][j] = NEFOL;
        }
    }

    fout << dp_cost(nr_gen, max_energie, gens, memo) << endl;
    return 0;
}