Pagini recente » Cod sursa (job #955924) | Cod sursa (job #1682206) | Cod sursa (job #2712357) | Cod sursa (job #157118) | Cod sursa (job #3160768)
#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 = 0x3f3f3f3f;
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;
memo[idx][energie] = min(cost_curr1, cost_curr2);
return min(cost_curr1, cost_curr2);
}
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;
}
}
int ans = dp_cost(nr_gen, max_energie, gens, memo);
fout << ((ans >= INF) ? -1 : ans) << endl;
return 0;
}