Задача о рюкзаке с фиксированным количеством предметов, которые надо положить в него

Есть рюкзак, максимальная вместимость которого 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;
} 

Количество слитков считается не правильно. Не понимаю в чем ошибка.


Ответы (0 шт):