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: Runtime Error)

// 考察メモ

#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
#include <tuple>
#include <vector>

using namespace std;
typedef long long int ll;
typedef vector<int> vi;
typedef vector<vi> vvi;

#define INF (1e9)

ll MOD = 998244353;
int N;

int main() {
    cin >> N;

    vi A(N);
    ll S = 0;
    for (int i = 0; i < N; i++) {
        cin >> A[i];
        S += A[i];
    }

    // R>G>Bとして、
    // Rに塗る整数の個数がiのとき、G,Bの決め方は2^(N-i)-2.
    // aの総和S
    // S/3 <= R < S/2の制約の中で、
    // Rを、作る個数ごとに数え上げる。
    // 最後に最後に何倍する？
    // 重複して数えている場合が多そう。
    // Rに入れるor入れないでbit全探索、絶対TLE
    // ここまで考察、残り40分
    // DP使えばいいかな？インデックスは何？残り20分

    vector<vvi> DP(int((S + 1) / 2), vvi(N, vi(N)));
    // 長さiの辺を、a0~ajまでのうちk-1個を使って作る方法の数
    for (int j = 0; j < N; j++) {
        for (int i = 0; i < int((S + 1) / 2); i++) {
            if (i == A[j]) DP[i][j][0] += 1;
            for (int k = 0; k < N; k++) {
                if (k > 0) DP[i][j][k] += DP[i][j - 1][k];
                if (i > A[j] && j > 0 && k > 0) {
                    DP[i][j][k] += DP[i - A[j]][j - 1][k - 1];
                }
                DP[i][j][k] %= MOD;
            }
        }
    }

    ll ans = 0;

    // ここにいろいろ書くつもりが時間足りなかった。
    // ここまでコーディング、残り8分

    cout << ans << endl;
    return 0;
}