Задача о рюкзаке с фиксированным количеством предметов, которые надо положить в него
Есть рюкзак, максимальная вместимость которого W. Есть слитки золота w (вектор,массив, список...), каждый с определенной массой. Какую массу они могут набрать в рюкзаке, чтобы сумма масс слитков была как можно больше, а количество слитков было ровно k.
(int W, int k, std::vector<int>& ls) {
std::vector<int> w = ls;
w.insert(w.begin(), 0);
int n = w.size()-1;
std::vector<std::vector<std::pair<int, int> > > dp(n + 1, std::vector<std::pair<int, int> > (W + 1, {0, 0})); // + 1 ???
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= W; j++) {
if (w[i] <= j) {
if (dp[i-1][j].first > w[i] + dp[i-1][j-w[i]].first) {
dp[i][j].first = dp[i-1][j].first;
dp[i][j].second = dp[i-1][j].second;
}
else if (dp[i-1][j].first < w[i] + dp[i-1][j-w[i]].first) {
dp[i][j].first = w[i] + dp[i-1][j-w[i]].first;
dp[i][j].second = dp[i-1][j - w[i]].second + 1;
} else {
dp[i][j].first = dp[i-1][j].first;
dp[i][j].second = std::min(dp[i-1][j].second, dp[i-1][j - w[i]].second + 1);
}
}
else {
dp[i][j].first = dp[i-1][j].first;
dp[i][j].second = dp[i-1][j].second;
}
}
}
int res = -1;
for (int i = W; i > 0; i--) {
if (dp[n][i].second == k) {
res = dp[n][i].first;
break;
}
}
return res;
}
Количество слитков считается не правильно. Не понимаю в чем ошибка.