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 <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;

#define EPS (1e-7)
#define INF (1e9)
#define PI (acos(-1))
const ll mod = 998244353;
ll N;
ll a[305];
ll beki[305];
ll dp[305][100000];

int main() {
    //cout.precision(10);
    cin >> N;
    ll sum = 0;
    for(int i = 1; i <= N; i++) {
        cin >> a[i];
        sum += a[i];
    }
    beki[0] = 1;
    dp[0][0] = 1;
    ll now_sum = 0;
    for(int i = 1; i <= 300; i++) beki[i] = beki[i-1] * 2 % mod;
    for(int index = 1; index <= N; index++) {
        for(int num = index - 1; num >= 0; num--) {
            for(int before = now_sum; before >= 0; before--) {
            //for(int before = ; before >= 0; before--) {
                //cerr << index << " " << num << " " << before << " " << dp[num][before] << endl;
                if(a[index] + before <= 90000) {
                    dp[num+1][before+a[index]] = (dp[num+1][before+a[index]] + dp[num][before]) % mod;
                }
            }
        }
        now_sum += a[index];
    }
    ll ans = 0;
    for(int num = 0; num <= N; num++) {
        ll now_sum = 0;
        for(int val = sum / 2 + 1; val <= sum; val++) {
            now_sum = (now_sum + 3 * dp[num][val]) % mod;
            //cerr << num << " " << val << " " << dp[num][val] << endl;
        }
        /*
        if(sum % 2 == 0) {
            ll plus = dp[num][sum/2];
            if(plus % 2 != 0) plus += mod;
            plus /= 2;
            now_sum = (now_sum + 3 * plus) % mod;
        }
        */
        ans += now_sum * beki[N-num];
        ans %= mod;
    }
    if(sum % 2 == 0) {
        ll now_sum = 0;
        for(int i = 0; i <= N; i++) {
            //cerr << i << " " << dp[i][sum/2] << endl;
            ans += 3 * dp[i][sum/2] * beki[N-i];
            ans %= mod;
            now_sum = (now_sum + dp[i][sum/2]) % mod;
        }
        ans -= 3 * now_sum;
        ans += 3 * mod;
        ans %= mod;
    }
    ll total = 1;
    for(int i = 1; i <= N; i++) total = total * 3 % mod;
    cout << (total + mod - ans) % mod << endl;
    return 0;
}