Cod sursa(job #3160766)

Utilizator RatebaSerbanescu Andrei Victor Rateba Data 25 octombrie 2023 01:46:13
Problema Energii Scor 15
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.53 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_GEN = 1001;
const int INF = -1;

struct t_gen {
    int energie;
    int cost;
};

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

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

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

    // 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] = INF;
        return INF;
    }

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

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

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

int main() {

    int nr_gen;
    int cant_energ;
    t_gen gens[MAX_GEN + 1];
    int memo[MAX_GEN + 1] = {-2};

    fin >> nr_gen >> cant_energ;

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

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