#include <iostream>
#include <vector>
using namespace std;
class Knapsack{
private:
vector<int> weights;
vector<int> values;
int n, w;
int **v;
public:
Knapsack(vector<int> wt, vector<int> val, int n, int cap){
// Сохранение переданных векторов, числа элементов и вместимости ранца
weights.assign(wt.begin(), wt.end());
values.assign(val.begin(), val.end());
this->n = n;
this->w = cap;
// Создание таблицы мемоизации и заполнение начальными значениями
v = new int * [n];
for(int i = 0; i < n; i++)
v[i] = new int [w];
// Инициализирование таблицы
for(int i = 0; i < n; i++)
for(int j = 0; j < w; j++)
v[i][j] = -1;
// Инициализирование нулями первой строки и первого столбца
for(int i = 0; i < w; i++)
v[0][i] = 0;
for(int i = 0; i < n; i++)
v[i][0] = 0;
}
~Knapsack(){
for(int i = 0; i < w; i++)
delete[] v[i];
delete[] v;
}
int knapsack_solver(int i, int j);
int solve();
};
int Knapsack::knapsack_solver(int i, int j){
int value;
if(v[i][j] < 0){
if(j < weights[i])
value = knapsack_solver(i - 1, j);
else
value = max(knapsack_solver(i - 1, j),
values[i] + knapsack_solver(i - 1, j - weights[i]));
v[i][j] = value;
}
return v[i][j];
}
int Knapsack::solve(){
return knapsack_solver(n, w);
}
int main(){
int n = 4, cap = 5;
int w[4] = {2, 1, 3, 2};
int v[4] = {12, 10, 20, 15};
vector<int> wt(w, w + 4);
vector<int> val(v, v + 4);
Knapsack knap(wt, val, n, cap);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgS25hcHNhY2t7CnByaXZhdGU6Cgl2ZWN0b3I8aW50PiB3ZWlnaHRzOwoJdmVjdG9yPGludD4gdmFsdWVzOwoJaW50IG4sIHc7CglpbnQgKip2OwpwdWJsaWM6CglLbmFwc2Fjayh2ZWN0b3I8aW50PiB3dCwgdmVjdG9yPGludD4gdmFsLCBpbnQgbiwgaW50IGNhcCl7CgkJLy8g0KHQvtGF0YDQsNC90LXQvdC40LUg0L/QtdGA0LXQtNCw0L3QvdGL0YUg0LLQtdC60YLQvtGA0L7Qsiwg0YfQuNGB0LvQsCDRjdC70LXQvNC10L3RgtC+0LIg0Lgg0LLQvNC10YHRgtC40LzQvtGB0YLQuCDRgNCw0L3RhtCwCgkJd2VpZ2h0cy5hc3NpZ24od3QuYmVnaW4oKSwgd3QuZW5kKCkpOwoJCXZhbHVlcy5hc3NpZ24odmFsLmJlZ2luKCksIHZhbC5lbmQoKSk7CgkJdGhpcy0+biA9IG47CgkJdGhpcy0+dyA9IGNhcDsKCQkvLyDQodC+0LfQtNCw0L3QuNC1INGC0LDQsdC70LjRhtGLINC80LXQvNC+0LjQt9Cw0YbQuNC4INC4INC30LDQv9C+0LvQvdC10L3QuNC1INC90LDRh9Cw0LvRjNC90YvQvNC4INC30L3QsNGH0LXQvdC40Y/QvNC4CgkJdiA9IG5ldyBpbnQgKiBbbl07CgkJZm9yKGludCBpID0gMDsgaSA8IG47IGkrKykKCQkJdltpXSA9IG5ldyBpbnQgW3ddOwoJCS8vINCY0L3QuNGG0LjQsNC70LjQt9C40YDQvtCy0LDQvdC40LUg0YLQsNCx0LvQuNGG0YsKCQlmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQoJCQlmb3IoaW50IGogPSAwOyBqIDwgdzsgaisrKQoJCQkJdltpXVtqXSA9IC0xOwoJCS8vINCY0L3QuNGG0LjQsNC70LjQt9C40YDQvtCy0LDQvdC40LUg0L3Rg9C70Y/QvNC4INC/0LXRgNCy0L7QuSDRgdGC0YDQvtC60Lgg0Lgg0L/QtdGA0LLQvtCz0L4g0YHRgtC+0LvQsdGG0LAKCQlmb3IoaW50IGkgPSAwOyBpIDwgdzsgaSsrKQoJCQl2WzBdW2ldID0gMDsKCQlmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQoJCQl2W2ldWzBdID0gMDsKCX0KCX5LbmFwc2FjaygpewoJCWZvcihpbnQgaSA9IDA7IGkgPCB3OyBpKyspCgkJCWRlbGV0ZVtdIHZbaV07CgkJZGVsZXRlW10gdjsKCX0KCglpbnQga25hcHNhY2tfc29sdmVyKGludCBpLCBpbnQgaik7CglpbnQgc29sdmUoKTsKfTsKCmludCBLbmFwc2Fjazo6a25hcHNhY2tfc29sdmVyKGludCBpLCBpbnQgail7CglpbnQgdmFsdWU7CglpZih2W2ldW2pdIDwgMCl7CgkJaWYoaiA8IHdlaWdodHNbaV0pCgkJCXZhbHVlID0ga25hcHNhY2tfc29sdmVyKGkgLSAxLCBqKTsKCQllbHNlCgkJCXZhbHVlID0gbWF4KGtuYXBzYWNrX3NvbHZlcihpIC0gMSwgaiksCgkJCQkJCXZhbHVlc1tpXSArIGtuYXBzYWNrX3NvbHZlcihpIC0gMSwgaiAtIHdlaWdodHNbaV0pKTsKCQl2W2ldW2pdID0gdmFsdWU7Cgl9CglyZXR1cm4gdltpXVtqXTsKfQoKaW50IEtuYXBzYWNrOjpzb2x2ZSgpewoJcmV0dXJuIGtuYXBzYWNrX3NvbHZlcihuLCB3KTsKfQoKaW50IG1haW4oKXsKCWludCBuID0gNCwgY2FwID0gNTsKCWludCB3WzRdID0gezIsIDEsIDMsIDJ9OwoJaW50IHZbNF0gPSB7MTIsIDEwLCAyMCwgMTV9OwoJdmVjdG9yPGludD4gd3QodywgdyArIDQpOwoJdmVjdG9yPGludD4gdmFsKHYsIHYgKyA0KTsKCglLbmFwc2FjayBrbmFwKHd0LCB2YWwsIG4sIGNhcCk7CgoJcmV0dXJuIDA7Cn0=