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: Time Limit Exceeded)

"use strict";
function I(s,f){this._s=s.split("\n");this._c=0;this._l=0;this._f=f||Number}I.prototype.a=function(){var l=this._s[this._l];if(!l)return;var t=l.trim().split(" ");var a=t[this._c];this._c++;if(t.length===this._c){this._c=0;this._l++}return this._f(a)};I.prototype.l=function(){var l=this._s[this._l];if(!l)return;this._c=0;this._l++;return l.split(" ").map(this._f)};
// function build2DArray(r,u,a){for(var f=a||0,n=[],o=0;o<r;o++){for(var h=[],i=0;i<u;i++)h.push(f);n.push(h)}return n}
 
const mod = 998244353;
function main(input) {
  var o = new I(input);
 
  var n = o.a();
  var a = [];
  for (var i = 0; i<n; i++) {
    a.push(o.a());
  }
 
  var sum = a.reduce((acc, cur) => acc + cur, 0);
 
  var total = 1;
  for (var i = 0; i < n; i++) {
    total = (total * 3) % mod;
  }
 
  var ans1 = 0; // R >= S/2

  var dp1 = new Map();
  dp1.set(0, 1);
  for (var i = 1; i <= n; i++) {
    var dp2 = new Map();
    for (var key of dp1.keys()) {
      if (!dp2.has(key)) dp2.set(key, 0);
      dp2.set(key, (dp2.get(key) + dp1.get(key) * 2) % mod);

      var next = key + a[i - 1];
      if (next <= sum) {
        if (!dp2.has(next)) dp2.set(next, 0);
          dp2.set(next, (dp2.get(next) + dp1.get(key)) % mod);
      }
    }
    dp1 = dp2;
  }
      

  for (var j = Math.ceil(sum/2); j <= sum; j++) {
    ans1 += dp1.has(j) ? dp1.get(j) : 0;
  }
 
  var ans2 = 0;
  if (sum % 2 === 0) {
    var dp3 = new Map();
    dp3.set(0, 1);
    for (var i = 1; i <= n; i++) {
      var dp4 = new Map();
      for (var key of dp3.keys()) {
        if (!dp4.has(key)) dp4.set(key, 0);
        dp4.set(key, (dp4.get(key) + dp3.get(key)) % mod);
  
        var next = key + a[i - 1];
        if (next <= sum) {
          if (!dp4.has(next)) dp4.set(next, 0);
            dp4.set(next, (dp4.get(next) + dp3.get(key)) % mod);
        }
      }
      dp3 = dp4;
    }
   
    ans2 = dp3.get(sum / 2)
  }
 
  let ans = (total - ans1 * 3 + ans2 * 3) % mod;
  ans = (ans + mod) % mod;
 
  console.log(ans);
}
 
 
main(require("fs").readFileSync("/dev/stdin", "utf8"));