Advertisement
Korotkodul

рюкзак

Oct 22nd, 2022 (edited)
953
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.29 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <string>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #define pii pair <int, int>
  11. #define pb(x) push_back(x)
  12. using namespace std;
  13. using ll = long long;
  14. using ld = long double;
  15. using db = double;
  16. void cv(vector <int> &v) {
  17.     for (auto x : v) cout << x << ' ';
  18.     cout << "\n";
  19. }
  20.  
  21. void cvl(vector <ll> &v) {
  22.     for (auto x : v) cout << x << ' ';
  23.     cout << "\n";
  24. }
  25.  
  26.  
  27. void cvv(vector <vector <int> > &v) {
  28.     for (auto x : v) cv(x);
  29.     cout << "\n";
  30. }
  31.  
  32. void cvb(vector <bool> v) {
  33.     for (bool x : v) cout << x << ' ';
  34.     cout << "\n";
  35. }
  36.  
  37. void cvs(vector <string>  v) {
  38.     for (auto a : v) {
  39.         cout << a << "\n";
  40.     }
  41. }
  42.  
  43. void cvp(vector <pii> a) {
  44.     for (auto p : a) {
  45.         cout << p.first << ' ' << p.second << "\n";
  46.     }
  47.     cout << "\n";
  48. }
  49.  
  50.  
  51. bool sh = 0;
  52.  
  53. vector <vector <bool> > can1, can2;
  54. vector <vector <pii> > pr1, pr2;
  55. //vector <pii> ans1, ans2;
  56. vector <int> ans1, ans2;
  57. vector <int> w1, w2;
  58.  
  59. void bld(vector <vector <bool> > &can, int &M, int &N, vector <vector <pii> > &pr, vector <int> &w) {
  60.     int n, m = 0;
  61.     cin >> n;
  62.     N = n;
  63.     w.resize(n + 1);
  64.     for (int i = 1; i <= n; ++i) {
  65.         cin >> w[i];
  66.         m += w[i];
  67.     }
  68.     M = m;
  69.     can.assign(m + 1, vector <bool> (n + 1, 0));
  70.     pr.assign(m + 1, vector <pii> (n + 1, {-1, -1}));
  71.     for (int i = 0; i <= n; ++i) {
  72.         can[0][i] = 1;
  73.     }
  74.     for (int i = 1; i <= m; ++i) {
  75.         for (int j = 1; j <= n; ++j) {
  76.             can[i][j] = can[i][j - 1];
  77.             pr[i][j] = pr[i][j - 1];
  78.  
  79.             if (i - w[j] < 0) {
  80.                 continue;
  81.             }
  82.  
  83.             if (!can[i - w[j]][j - 1]) {
  84.                 continue;
  85.             }
  86.  
  87.             can[i][j] = 1;
  88.             pr[i][j] = {i - w[j], j - 1};
  89.         }
  90.     }
  91. }
  92.  
  93.  
  94.  
  95. int main() {
  96.     /*ios::sync_with_stdio(0);
  97.     cin.tie(0);
  98.     cout.tie(0);*/
  99.     int s; cin >> s;
  100.     int m1, m2, n1, n2;
  101.     bld(can1, m1, n1, pr1, w1);
  102.     bld(can2, m2, n2, pr2, w2);
  103.     for (int i = s; i <= m1; ++i) {
  104.         if (i - s > m2) {
  105.             continue;
  106.         }
  107.         if (can1[i][n1] && can2[i - s][n2]) {
  108.  
  109.             if (sh) {
  110.                 cout << "i i - s = " << i << ' ' << i - s << "\n";
  111.             }
  112.  
  113.             pii p;
  114.             p = {i, n1};
  115.             p = pr1[p.first][p.second];
  116.             int s0 = 0;
  117.             while (p.first != 0 && p != pii{-1, -1}) {
  118.                 ans1.push_back(w1[p.second]);
  119.                 s0 += w1[p.second];
  120.                 p = pr1[p.first][p.second];
  121.  
  122.             }
  123.             ans1.push_back(i - s0);
  124.             if (sh) {
  125.                 cout << "s0 = " << s0 << "\n";
  126.             }
  127.  
  128.             s0 = 0;
  129.             p = {i - s, n2};
  130.             p = pr2[p.first][p.second];
  131.             while (p.first != 0 && p != pii{-1, -1}) {
  132.                 ans2.push_back(w2[p.second]);
  133.                 s0 += w2[p.second];
  134.                 p = pr2[p.first][p.second];
  135.  
  136.             }
  137.             ans2.push_back(i - s - s0);
  138.             if (sh) {
  139.                 cout << "s0 = " << s0 << "\n";
  140.             }
  141.  
  142.             if (sh) {
  143.                 cout << "ans1\n";
  144.                 cv(ans1);
  145.                 cout << "ans2\n";
  146.                 cv(ans2);
  147.             }
  148.             for (int i: ans1 ) {
  149.                 cout << "+" << i << " ";
  150.             }
  151.             for (int i: ans2) {
  152.                 cout << "-" << i << " ";
  153.             }
  154.  
  155.             //break;
  156.             exit(0);
  157.         }
  158.     }
  159.     //cout << "done\n";
  160.  
  161.  
  162.     if (sh) {
  163.         cout << "can1\n";
  164.         for (auto v: can1) {
  165.             cvb(v);
  166.         }
  167.         cout << "\n";
  168.  
  169.         cout << "pr1\n";
  170.         for (auto v: pr1) {
  171.             for (auto p: v) {
  172.                 cout << "(" << p.first << "," << p.second << ") ";
  173.             } cout << "\n";
  174.         } cout << "\n";
  175.  
  176.         cout << "can2\n";
  177.         for (auto v: can2) {
  178.             cvb(v);
  179.         }
  180.  
  181.         cout << "\n";
  182.  
  183.         cout << "pr2\n";
  184.         for (auto v: pr2) {
  185.             for (auto p: v) {
  186.                 cout << "(" << p.first << "," << p.second << ") ";
  187.             } cout << "\n";
  188.         } cout << "\n";
  189.     }
  190.  
  191.     cout << "Impossible";
  192. }
  193.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement