Cod sursa(job #3258148)

Utilizator lefterache_stefanLefterache Stefan lefterache_stefan Data 21 noiembrie 2024 11:21:26
Problema Problema rucsacului Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#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;
}