Advertisement
Gistrec

Задача о ранце [КОДЫ ГРЕЯ]

Feb 24th, 2018
315
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.37 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. using namespace std;
  5.  
  6. int n; // Кол-во предметов
  7.  
  8. int max_weight; // Максимальный вес предметов
  9.  
  10. vector<int> item_weight; // Вес предметов
  11. vector<int> item_cost; // Цена предметов
  12.  
  13. inline int getCost(vector<bool> &mask) {
  14.     int result = 0;
  15.     for (int i = 0; i < n; ++i) {
  16.         if (mask[i]) result += item_cost[i];
  17.     }
  18.     return result;
  19. }
  20.  
  21. void knapsack() {
  22.     const unsigned int nIterations = 1 << n; // количество комбинаций, 2^n
  23.     int sum = 0;      // текущий вес вещей
  24.     int cost = 0;     // текущая стоимость вещей
  25.  
  26.     int bestCost = 0; // максимальная стоимость стоимость (максимальная, без перегрузки)
  27.     int bestSum = 0;  // вес при максимальной стоимости
  28.  
  29.     vector<bool> mask(n);               // текущая комбинация выбранных вещей
  30.     vector<bool> bestMask(n);           // лучшая комбинация выбранных вещей
  31.  
  32.     for (unsigned int i = 1; i < nIterations; i++) {
  33.  
  34.         // какой по счёту бит инвертируем
  35.         unsigned long position;    
  36.         _BitScanForward(&position, i);
  37.         mask[position] = !mask[position];
  38.        
  39.         // кладём в рюкзак или убираем эту вещь
  40.         if (mask[position]) sum += item_weight[position];
  41.         else sum -= item_weight[position];
  42.  
  43.         // перегруз
  44.         if (sum > max_weight) continue;
  45.  
  46.         cost = getCost(mask);
  47.         // Если цена текущего набора больше цены максимального
  48.         if (cost > bestCost) {
  49.             // Отличный вариант! Надо запомнить...
  50.             bestCost = cost;
  51.             bestMask = mask;
  52.             bestSum = sum;
  53.         }
  54.     }
  55.  
  56.     cout << "Вес у максимальной цены: " << bestSum << endl;
  57.     cout << "Максимальная цена: " << bestCost << endl;
  58.     cout << "Используемые веса:";
  59.     for (int i = 0; i < 5; i++)
  60.         if (bestMask[i]) cout << " " << item_weight[i];
  61.     cout << endl;
  62. }
  63.  
  64. int main() {
  65.     setlocale(LC_ALL, "Russian");
  66.    
  67.     // Сюда засунуть ввод
  68.     item_weight = { 1, 9, 2, 3, 5};
  69.     item_cost = { 50, 700, 300, 200, 500 };
  70.     max_weight = 10;
  71.     n = 5;
  72.  
  73.     knapsack();
  74.     system("pause");
  75.     return 0;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement