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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.util.*;

public class Main {

    static final long MOD  = 998_244_353;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        int sum = 0;
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
            sum += a[i];
        }
        long[][] dp = new long[n+1][sum+1];
        long[][] dp2 = new long[n+1][sum+1];
        dp[0][0] = 1;
        dp2[0][0] = 1;
        int tmpSum = 0;
        for (int i = 1; i < n+1; i++) {
            tmpSum += a[i-1];
            for(int j = 0; j < tmpSum+1; j++){
                if(a[i-1] <= j) dp[i][j] += dp[i-1][j-a[i-1]];
                dp[i][j] %= MOD;
                dp[i][j] += dp[i-1][j]*2;
                dp[i][j] %= MOD;

                if(a[i-1] <= j) dp2[i][j] += dp2[i-1][j-a[i-1]];
                dp2[i][j] %= MOD;
                dp2[i][j] += dp2[i-1][j];
                dp2[i][j] %= MOD;
            }
        }
        long ans = modPow(3, n);
        for (int i = (sum+1)/2; i < sum+1; i++) {
            ans -= dp[n][i] * 3;
            if(ans < 0)ans += MOD;
        }
        if(sum % 2 == 0){
            ans += dp2[n][sum/2] * 3;
            ans %= MOD;
        }
        System.out.println(ans);
        sc.close();
    }

    public static long modPow(long base, int exp) {
        long ret = 1;
        while(exp > 0){
            if((exp & 1) == 1){
                ret = ret * base %MOD;
            }
            base = base * base %MOD;
            exp >>= 1;
        }
        return ret;
    }

}