AmidamaruZXC

Untitled

Apr 12th, 2020
231
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.81 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5. #include <algorithm>
  6.  
  7. using namespace std;
  8.  
  9. void findAns(int** table, pair<int, int>* items, vector<pair<int, int>>& res, int i, int j)
  10. {
  11.     if (i == 0)
  12.         if (table[i][j] != 0)
  13.         {
  14.             res.push_back(items[i]);
  15.             return;
  16.         }
  17.     if (table[i][j] != table[i - 1][j])
  18.     {
  19.         findAns(table, items, res, i - 1, j - items[i].first);
  20.         res.push_back(items[i]);
  21.     }
  22.     else
  23.         findAns(table, items, res, i - 1, j);
  24. }
  25.  
  26. //Задача реализовать этот метод (жадный алгоритм)
  27. //param N - количество предметов
  28. //param W - ограничения на вес рюкзака
  29. //param items - массив размера N, с предметами - first = вес, second = стоимость
  30. //param res - вектор результатов (предметы, которые надо взять)
  31. void solve(int N, int W, pair<int, int>* items, vector<pair<int, int>>& res)
  32. {
  33.     int** table = new int* [N];
  34.     for (int i = 0; i < N; ++i)
  35.         table[i] = new int[W + 1];
  36.  
  37.     for (int j = 0; j <= W; ++j)
  38.         table[0][j] = (j - items[0].first >= 0) ? items[0].second : 0;
  39.  
  40.     for (int i = 0; i < N; ++i)
  41.         table[i][0] = 0;
  42.  
  43.     for (int i = 1; i < N; ++i)
  44.         for (int j = 1; j <= W; ++j)
  45.             if (j - items[i].first >= 0)
  46.                 table[i][j] = max(table[i - 1][j], table[i - 1][j - items[i].first] + items[i].second);
  47.             else
  48.                 table[i][j] = table[i - 1][j];
  49.  
  50.     findAns(table, items, res, N - 1, W);
  51.  
  52.     for (int i = 0; i < N; ++i)
  53.         delete[] table[i];
  54.     delete[] table;
  55. }
  56.  
  57. int main(int argc, const char* argv[])
  58. {
  59.     int N, W;
  60.  
  61.     cin >> N >> W;
  62.  
  63.     //структура массив pair выбрана, так как известно количество элементов, и у объекта всего 2 характеристики
  64.     //first = вес(weight), second = стоимость (cost)
  65.     //Можно переложить данные в любую другую удобную струтуру
  66.     //Внимание(!) данные не упорядочены, но можно это сделать если вам требуется
  67.     pair<int, int>* arr = new pair<int, int>[N];
  68.     for (int i = 0; i < N; i++)
  69.         cin >> arr[i].first;
  70.  
  71.     for (int i = 0; i < N; i++)
  72.         cin >> arr[i].second;
  73.  
  74.     //структура вектор pair выбрана, так как неизвестно количество элементов, и у объекта всего 2 характеристики
  75.     //результат, также first = вес(weight), second = стоимость (cost)
  76.     vector<pair<int, int>> res;
  77.     solve(N, W, arr, res);
  78.  
  79.     int sumCost = 0, sumWeight = 0;
  80.     for (int i = 0; i < res.size(); i++)
  81.     {
  82.         sumWeight += res[i].first;
  83.         sumCost += res[i].second;
  84.     }
  85.     cout << sumCost;
  86.  
  87.     delete[] arr;
  88.     return 0;
  89. }
Advertisement
Add Comment
Please, Sign In to add comment