Problem:
Score : 600 points

Problem Statement

You are given N integers. The i-th integer is a_i.
Find the number, modulo 998244353, of ways to paint each of the integers red, green or blue so that the following condition is satisfied:

Let R, G and B be the sums of the integers painted red, green and blue, respectively. There exists a triangle with positive area whose sides have lengths R, G and B.

Constraints

3 \leq N \leq 300

1 \leq a_i \leq 300(1\leq i\leq N)

All values in input are integers.

Input

Input is given from Standard Input in the following format:

N
a_1
:
a_N

Output

Print the number, modulo 998244353, of ways to paint each of the integers red, green or blue so that the condition is satisfied.

Sample Input 1

4
1
1
1
2

Sample Output 1

18

We can only paint the integers so that the lengths of the sides of the triangle will be 1, 2 and 2, and there are 18 such ways.

Sample Input 2

6
1
3
2
3
5
2

Sample Output 2

150

Sample Input 3

20
3
1
4
1
5
9
2
6
5
3
5
8
9
7
9
3
2
3
8
4

Sample Output 3

563038556

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)


#include <cstdio>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <string>
using namespace std;
#define REP(i, n) for(int i = 0; i < (int)(n); ++i)
typedef long long ll;

const int MOD = 998244353;
ll total;
ll vs[310];
int n;

struct K {
  ll r, g;
  int p;
};
ll encode(const K& k) {
  return (k.r * 100000LL + k.g)*310 + k.p;
}
ll encode(ll r, ll g, int p) {
  return (r * 100000LL + g)*310 + p;
}
K decode(ll key) {
  K res;
  res.p = key % 310;
  key /= 310;
  res.g = key % 100000;
  res.r = key / 100000;
  return res;
}

map<ll, ll> memo;
ll solve(ll r, ll g, int p) {
  ll key = encode(r,g,p);
  if(memo.count(key) == 0) {
    ll res = 0;
    if(p == n) {
      ll b = total - r - g;
      if(r+g > b && g+b > r && b+r > g) {
        // cerr << r << " " << g << " " << b << " OK" << endl;
        res = 1;
      } else {
        // cerr << r << " " << g << " " << b << endl;
        res = 0;
      }
    } else {
      res += solve(r + vs[p], g, p+1);
      res += solve(r, g + vs[p], p+1);
      res += solve(r, g, p+1);
      res %= MOD;
    }
    memo[key] = res;
  }
  return memo[key];
}

int main(void) {
  scanf("%d", &n);
  REP(i, n) {
    scanf("%lld", &vs[i]);
    total += vs[i];
  }
  sort(vs, vs+n);
  ll res = solve(0, 0, 0);
  cout << res << endl;
  return 0;
}