#yukicoder2840 RGB Plates #入力受取 M = max(A) とする N: int = int(input()) A: list[int] = [int(Ai) for Ai in input().split()] M: int = max(A) #comb(N, k)の前計算 十分に大きくなったら打ち切り sub: list[int] = [1] * (N + 1) INF: int = 10 ** 9 for k in range(1, - (- N >> 1) + 1): sub[k] = sub[N - k] = sub[k - 1] * (N - k + 1) // k if sub[k - 1] >= INF or sub[k] >= INF: sub[k] = sub[N - k] = INF def comb(n: int, k: int) -> int: assert n == N return sub[k] if 0 <= k <= n else 0 #N要素からk要素を選ぶ場合の数は comb(N, k) 通りある #解の範囲は 0 <= w <= Mk 通りなので、Mk + 1 < comb(N, k) となるkがあれば解がMk以下と分かる for k in range(1, N + 1): if M * k + 1 < comb(N, k): break W: int = M * k #重さW以下に絞ったナップサック問題 #DP[w]: 重さ総和がちょうどwとなるような選び方。ただし、2以上は2に丸める DP: list[int] = [0] * (W + 1) DP[0] = 1 for Ai in A: for w in range(W - Ai, -1, -1): DP[w + Ai] += DP[w] if DP[w + Ai] > 2: DP[w + Ai] = 2 #場合の数が2通り以上となる最小のwがあれば、G = B = w, R = sum(A) - 2w とする ans: int = -1 for w in range(1, W + 1): if DP[w] >= 2: R: int = sum(A) - 2 * w if R != 0: ans = R break print(ans)