fork download
  1. #include <iostream>
  2. #include <vector>
  3. using namespace std;
  4.  
  5.  
  6. class Knapsack{
  7. private:
  8. vector<int> weights;
  9. vector<int> values;
  10. int n, w;
  11. //int **v;
  12. vector< vector<int> > v;
  13. public:
  14. Knapsack(vector<int> wt, vector<int> val, int n, int cap){
  15. // Сохранение переданных векторов, числа элементов и вместимости ранца
  16. weights.assign(wt.begin(), wt.end());
  17. values.assign(val.begin(), val.end());
  18. this->n = n;
  19. this->w = cap;
  20. // Создание таблицы мемоизации и заполнение начальными значениями
  21. /*v = new int * [n];
  22. for(int i = 0; i < n; i++)
  23. v[i] = new int [w];*/
  24. v = vector<n, vector<int>(w));
  25. // Инициализирование таблицы
  26. for(int i = 0; i < n; i++)
  27. for(int j = 0; j < w; j++)
  28. v[i][j] = -1;
  29. // Инициализирование нулями первой строки и первого столбца
  30. for(int i = 0; i < w; i++)
  31. v[0][i] = 0;
  32. for(int i = 0; i < n; i++)
  33. v[i][0] = 0;
  34. }
  35. ~Knapsack(){
  36. //for(int i = 0; i < n; i++)
  37. // delete[] v[i];
  38. //delete[] v;
  39. }
  40.  
  41. int knapsack_solver(int i, int j);
  42. int solve();
  43. };
  44.  
  45. int Knapsack::knapsack_solver(int i, int j){
  46. int value;
  47. if(v[i][j] < 0){
  48. if(j < weights[i])
  49. value = knapsack_solver(i - 1, j);
  50. else
  51. value = max(knapsack_solver(i - 1, j),
  52. values[i] + knapsack_solver(i - 1, j - weights[i]));
  53. v[i][j] = value;
  54. }
  55. return v[i][j];
  56. }
  57.  
  58. int Knapsack::solve(){
  59. return knapsack_solver(n, w);
  60. }
  61.  
  62. int main(){
  63. int n = 4, cap = 5;
  64. int w[4] = {2, 1, 3, 2};
  65. int v[4] = {12, 10, 20, 15};
  66. vector<int> wt(w, w + 4);
  67. vector<int> val(v, v + 4);
  68.  
  69. Knapsack knap(wt, val, n, cap);
  70. cout << knap.solve() << endl;
  71.  
  72. int pause;
  73. cin >> pause;
  74.  
  75. return 0;
  76. }
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.cpp: In constructor 'Knapsack::Knapsack(std::vector<int>, std::vector<int>, int, int)':
prog.cpp:24:30: error: temporary of non-literal type 'std::vector<int>' in a constant expression
   v = vector<n, vector<int>(w));
                              ^
In file included from /usr/include/c++/5/vector:64:0,
                 from prog.cpp:2:
/usr/include/c++/5/bits/stl_vector.h:214:11: note: 'std::vector<int>' is not literal because:
     class vector : protected _Vector_base<_Tp, _Alloc>
           ^
/usr/include/c++/5/bits/stl_vector.h:214:11: note:   'std::vector<int>' has a non-trivial destructor
prog.cpp:24:30: error: type/value mismatch at argument 1 in template parameter list for 'template<class _Tp, class _Alloc> class std::vector'
   v = vector<n, vector<int>(w));
                              ^
prog.cpp:24:30: note:   expected a type, got 'n'
prog.cpp:24:30: error: type/value mismatch at argument 2 in template parameter list for 'template<class _Tp, class _Alloc> class std::vector'
prog.cpp:24:30: note:   expected a type, got 'std::vector<int>(((std::vector<int>::size_type)((Knapsack*)this)->Knapsack::w), std::allocator<int>())'
stdout
Standard output is empty