Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <cstring>
- #include <string>
- #include <cctype>
- #include <stack>
- #include <queue>
- #include <list>
- #include <vector>
- #include <cmath>
- #include <math.h>
- #include <bitset>
- #include <utility>
- #include <set>
- #include <numeric>
- #include <sstream>
- using namespace std;
- int m;
- int a[25];
- int x;
- int dp[(1 << 20) + 75][5];
- int sums[(1 << 20) + 75];
- int sumOf(int taken) {
- int ret = 0;
- for (int i = 0; i < m; i++)
- if (((taken >> i) & 1) == 1)
- ret += a[i];
- return ret;
- }
- bool ok(int taken, int side) {
- if (sums[taken] == x * side) {
- if (side == 3)
- return true;
- return ok(taken, side + 1);
- }
- if (sums[taken] > x * side)
- return false;
- if (dp[taken][side] != -1)
- return dp[taken][side] == 1;
- bool ret = false;
- for (int i = 0; i < m; i++)
- if (((taken >> i) & 1) == 0) {
- ret |= ok(taken | (1 << i), side);
- if (ret) {
- dp[taken][side] = 1;
- return true;
- }
- }
- dp[taken][side] = 0;
- return false;
- }
- int main() {
- int T;
- scanf("%d", &T);
- register int i, s;
- while (T--) {
- scanf("%d", &m);
- for (i = 0; i < m; i++)
- scanf("%d", &a[i]);
- x = 0;
- for (i = 0; i < m; i++)
- x += a[i];
- if (x % 4 != 0) {
- printf("no\n");
- continue;
- }
- x /= 4;
- s = (1 << m) + 50;
- for (i = 0; i < s; i++) {
- dp[i][0] = dp[i][1] = dp[i][2] = dp[i][3] = -1;
- sums[i] = sumOf(i);
- }
- if (ok(0, 1))
- printf("yes\n");
- else
- printf("no\n");
- }
- return 0;
- }
Add Comment
Please, Sign In to add comment