Advertisement
Guest User

Untitled

a guest
May 22nd, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.47 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <vector>
  4. #include <iostream>
  5. #include <fstream>
  6.  
  7. using namespace std;
  8. int ind, trudoemkost = 0;
  9. vector <int> set;
  10.  
  11. int search_min(vector <int> m) {
  12.     int min = m[0];
  13.     for (int i = 1; i < m.size(); i++) {
  14.         if (m[i] < min) min = m[i];
  15.     }
  16.     return min;
  17. }
  18.  
  19. double search_max(vector <double> m) {
  20.     double max = m[0];
  21.     for (int i = 1; i < m.size(); i++) {
  22.         if (m[i] > max) {
  23.             max = m[i];
  24.             ind = i;
  25.         }
  26.     }
  27.     return max;
  28. }
  29.  
  30. vector <int> get_set_products(vector <int> prev, vector <int> m, int W) {
  31.     vector <int> indexes;
  32.     int weight = W;
  33.     while (weight != 0) {
  34.         int temp = m[prev[weight]];
  35.         if (weight - temp < 0) break;
  36.         indexes.push_back(prev[weight]);
  37.         weight -= temp;
  38.     }
  39.     return indexes;
  40. }
  41.  
  42. double task_about_bag(vector <int> m, vector <double> c, int W, int n) {
  43.     vector <double> f, sums;
  44.     vector <int> prev;
  45.     int min_mass = search_min(m);
  46.     for (int i = 0; i < W; i++) {
  47.         if (i < min_mass) {
  48.             f.push_back(0);
  49.             prev.push_back(0);
  50.         }
  51.         else break;
  52.     }
  53.     for (size_t i = f.size(); i <= W; i++) {
  54.         trudoemkost++;
  55.         for (int k = 0; k < n; k++) {
  56.             trudoemkost++;
  57.             int temp = i - m[k];
  58.             if (temp < 0) sums.push_back(-1);
  59.             else sums.push_back(f[i - m[k]] + c[k]);
  60.         }
  61.         double max = search_max(sums);
  62.         prev.push_back(ind);
  63.         f.push_back(max);
  64.         sums.clear();
  65.         ind = 0;
  66.     }
  67.     set = get_set_products(prev, m, W);
  68.     return f[f.size() - 1];
  69. }
  70.  
  71. int main() {
  72.     int W, N;
  73.     char ch;
  74.     int num;
  75.     double num_1;
  76.     vector <int> masses;
  77.     vector <double> costs;
  78.     ifstream fin("input.txt");
  79.  
  80.     fin >> W >> N;
  81.     for(int i = 0; i < N; i++){
  82.         int tmp;
  83.         fin >> tmp;
  84.         masses.push_back(tmp);
  85.         fin >> tmp;
  86.         costs.push_back(tmp);
  87.     }
  88.  
  89.     double max_cost = task_about_bag(masses, costs, W, N);
  90. // set[i] + 1 == продукт по счету
  91.     for (int i = 0; i < set.size(); i++) {
  92.         printf("Weight\t\t %d\t\t РЎost\t\t %d\n", masses[set[i]], (int)costs[set[i]]);
  93.     }
  94.     cout << "----------------------------------" << endl;
  95.     printf("Total weight %d\t\t Total cost %d\n", W, (int)max_cost);
  96.  
  97.  
  98.     printf("\nOperations: %d\n\n", trudoemkost);
  99.    
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement