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 JavaScript (node.js v5.12) (judge verdict: Wrong Answer)

"use strict";
function Main(input) {
    let cin = new Inputer(input);
    let n = cin.getInt(), a = cin.getIntArray(n);
    const Maxn = 305, p = 998244353;
    let sum = new Array(Maxn); sum[0] = 0;
    let dp = new Array(Maxn * Maxn).fill(0);
    let dp2 = new Array(Maxn * Maxn).fill(0);
    const div2 = (a) => Math.floor(a / 2);
    const div = (a, b) => Math.floor(a / b);

    a.sort((a, b) => a - b);
    a.unshift(0);
    for (let i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i];
    dp[0] = Math.pow(2, n);
    dp2[0] = 1;
    for (let i = 1; i <= n; i++)
        for (let j = sum[i]; j >= a[i]; j--)
            dp[j] = (dp[j] + 499122177 * dp[j - a[i]] % p) % p,
                dp2[j] = (dp2[j] + dp2[j - a[i]]) % p;
    let ans = 0;
    if (!(sum[n] % 2)) ans += dp[div2(sum[n])] - dp2[div2(sum[n])];
    for (let i = div2(sum[n]) + 1; i <= sum[n]; i++)
        ans = (ans + dp[i]) % p;
    ans *= 3;
    ans = ((Math.pow(3, n) - ans) % p + p) % p;
    console.log(ans);
}
class Inputer{constructor(t){this.cnt=0,this.items=t.split(/\n|\s/)}getInt(){return this.items[this.cnt++]-0}getIntArray(t){let r=new Array(t);for(let e=0;e<t;e++)r[e]=this.getInt();return r}getStr(){return this.items[this.cnt++]}getStrArray(t){let r=new Array(t);for(let e=0;e<t;e++)r[e]=this.getStr();return r}}
if (typeof window == "undefined") Main(require("fs").readFileSync("/dev/stdin", "utf8"));