Pagini recente » Cod sursa (job #1887908) | Cod sursa (job #3211089) | Cod sursa (job #2900008) | Cod sursa (job #781611) | Cod sursa (job #3258148)
#include <fstream>
#include <map>
using namespace std;
ifstream fin("rucsac.in");
ofstream fout("rucsac.out");
const int MAXIM = 5005;
int n, greutate_max;
int greutati[MAXIM];
int valori[MAXIM];
static inline void citire() {
fin >> n >> greutate_max;
for (int i = 0; i < n; ++i) {
fin >> greutati[i] >> valori[i];
}
}
map<pair<int, int>, int> cache; // cache[greu,k] = val
int rucsac(int greutate, int valoare, int k) {
if (greutate > greutate_max) {
return -1;
}
if (k == n) {
return valoare;
}
if (cache[{greutate, k}]) {
return cache[{greutate, k}];
}
int optiunea_fara = rucsac(
greutate,
valoare,
k + 1
);
int optiunea_cu = rucsac(
greutate + greutati[k],
valoare + valori[k],
k + 1
);
int raspuns = max(optiunea_fara, optiunea_cu);
cache[{greutate, k}] = raspuns;
return raspuns;
}
int main() {
citire();
fout << rucsac(0, 0, 0) << '\n';
return 0;
}