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: Accepted)

import java.util.*;

public class Main {

	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];
		}

		final long MOD = 998244353;

		long[][] dp = new long[2][sum+1];
		dp[0][0] = 1;
		int flg=0;
		for(int i=0; i<N; i++) {
			Arrays.fill(dp[flg^1], 0);
			for(int j=0; j<=sum; j++) {
				dp[flg^1][j] = (dp[flg^1][j] + dp[flg][j]*2) %MOD;
				if(j+a[i]<=sum)
					dp[flg^1][j+a[i]] = (dp[flg^1][j+a[i]] + dp[flg][j]) %MOD;
			}
			flg ^= 1;
		}
		long over = 0;
		for(int i=(sum+1)/2; i<=sum; i++)
			over = (over + dp[flg][i])%MOD;
		
		long ans = 1;
		for(int i=0; i<N; i++)
			ans = (ans * 3) % MOD;
		
		ans = (ans - over*3 + MOD*3) % MOD;
		if(sum%2==0) {
			long[][] dp2 = new long[2][sum/2+1];
			dp2[0][0] = 1;
			flg=0;
			for(int i=0; i<N; i++) {
				Arrays.fill(dp2[flg^1], 0);
				for(int j=0; j<=sum/2; j++) {
					dp2[flg^1][j] = (dp2[flg^1][j] + dp2[flg][j]) %MOD;
					if(j+a[i]<=sum/2)
						dp2[flg^1][j+a[i]] = (dp2[flg^1][j+a[i]] + dp2[flg][j]) %MOD;
				}
				flg ^= 1;
			}
			ans = (ans + dp2[flg][sum/2]*3 + MOD*3) % MOD;

		}
		System.out.println(ans);
		sc.close();
	}
}