Guest User

Untitled

a guest
Jun 22nd, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.51 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. #include <string>
  6. #include <cctype>
  7. #include <stack>
  8. #include <queue>
  9. #include <list>
  10. #include <vector>
  11. #include <cmath>
  12. #include <math.h>
  13. #include <bitset>
  14. #include <utility>
  15. #include <set>
  16. #include <numeric>
  17. #include <sstream>
  18. using namespace std;
  19. int m;
  20. int a[25];
  21. int x;
  22. int dp[(1 << 20) + 75][5];
  23. int sums[(1 << 20) + 75];
  24.  
  25. int sumOf(int taken) {
  26.     int ret = 0;
  27.     for (int i = 0; i < m; i++)
  28.         if (((taken >> i) & 1) == 1)
  29.             ret += a[i];
  30.     return ret;
  31. }
  32. bool ok(int taken, int side) {
  33.     if (sums[taken] == x * side) {
  34.         if (side == 3)
  35.             return true;
  36.         return ok(taken, side + 1);
  37.     }
  38.     if (sums[taken] > x * side)
  39.         return false;
  40.     if (dp[taken][side] != -1)
  41.         return dp[taken][side] == 1;
  42.    
  43.     bool ret = false;
  44.     for (int i = 0; i < m; i++)
  45.         if (((taken >> i) & 1) == 0) {
  46.             ret |= ok(taken | (1 << i), side);
  47.             if (ret) {
  48.                 dp[taken][side] = 1;
  49.                 return true;
  50.             }
  51.         }
  52.    
  53.     dp[taken][side] = 0;
  54.     return false;
  55. }
  56.  
  57. int main() {
  58.  
  59.     int T;
  60.     scanf("%d", &T);
  61.     register int i, s;
  62.     while (T--) {
  63.         scanf("%d", &m);
  64.         for (i = 0; i < m; i++)
  65.             scanf("%d", &a[i]);
  66.         x = 0;
  67.         for (i = 0; i < m; i++)
  68.             x += a[i];
  69.         if (x % 4 != 0) {
  70.             printf("no\n");
  71.             continue;
  72.         }
  73.         x /= 4;
  74.         s = (1 << m) + 50;
  75.         for (i = 0; i < s; i++) {
  76.             dp[i][0] = dp[i][1] = dp[i][2] = dp[i][3] = -1;
  77.             sums[i] = sumOf(i);
  78.         }
  79.         if (ok(0, 1))
  80.             printf("yes\n");
  81.         else
  82.             printf("no\n");
  83.     }
  84.     return 0;
  85. }
Add Comment
Please, Sign In to add comment