artemgf

Получение из множества сумму равную нулю

Jan 19th, 2018
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.51 KB | None | 0 0
  1. #define _USE_MATH_DEFINES
  2. #include <iostream>
  3. #include <string>
  4. #include <map>
  5. #include <set>
  6. #include <algorithm>
  7. #include <vector>
  8. #include <stdio.h>
  9. #include <cmath>
  10. #include <math.h>
  11. #include <queue>
  12. #include <stack>
  13. #include <climits>
  14. #include <deque>
  15. #include <ctime>
  16.  
  17. using namespace std;
  18.  
  19. typedef long long ll;
  20. typedef unsigned long long ull;
  21. typedef unsigned int ui;
  22.  
  23. #define mh() make_heap()
  24. #define poph() pop_heap()
  25. #define pushh() push_heap()
  26. #define sor(n) n.begin(), n.end()
  27. #define rsor(n) n.rbegin(), n.rend()
  28. #define mp make_pair
  29. #define files freopen("input.txt", "rt", stdin); freopen("output.txt", "wt", stdout)
  30. #define p(T) pair<T,T>
  31. #define znac(l) abs(l)/l
  32. const ll ok = ll(1e9 + 7);
  33.  
  34. int main()
  35. {
  36.     //files;
  37.     ll n;
  38.     cin >> n;
  39.     ll arr[2001];
  40.     ll sum = 0;
  41.     for (int i = 0; i < n; i++)
  42.     {
  43.         cin >> arr[i];
  44.         sum += arr[i];
  45.     }
  46.     vector<ll>way(sum + 1);
  47.     vector<ll>pos(sum + 1);
  48.     if (sum == 0)
  49.     {
  50.         for (int i = 0; i < n; i++)
  51.         {
  52.             cout << "+";
  53.         }
  54.         return 0;
  55.     }
  56.     for (int i = 0; i < sum+1; ++i)
  57.         way[i] = 0;
  58.  
  59.     way[0] = 1;
  60.  
  61.     for (int i = 0; i < n; ++i)
  62.         for (ll j = sum; j > 0; --j)
  63.         {
  64.             if (arr[i] != 0)
  65.                 if (j >= arr[i] && way[j - arr[i]] != 0&&way[j]==0)
  66.                 {
  67.                     way[j] = arr[i];
  68.                     pos[j] = i;
  69.                 }
  70.         }
  71.  
  72.     ll j = sum / 2;
  73.     while (j != 0)
  74.     {
  75.         arr[pos[j]] = -arr[pos[j]];
  76.         j -= way[j];
  77.     }
  78.     string h = "";
  79.     for (int i = 0; i < n; i++)
  80.     {
  81.         if (arr[i] < 0)
  82.             h += "-";
  83.         else
  84.         {
  85.             h += "+";
  86.         }
  87.     }
  88.     cout << h;
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment