← Home
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func abs(x int64) int64 {
	if x < 0 {
		return -x
	}
	return x
}

func dfs(idx int, currentSum int64, count int, vals []int64, minT, maxT int64, posSuffixSum []int64, negSuffixSum []int64) bool {
	if currentSum >= minT && currentSum <= maxT {
		if count > 0 && count < len(vals) {
			return true
		}
	}
	if idx == len(vals) {
		return false
	}
	if currentSum+posSuffixSum[idx] < minT {
		return false
	}
	if currentSum+negSuffixSum[idx] > maxT {
		return false
	}

	if dfs(idx+1, currentSum+vals[idx], count+1, vals, minT, maxT, posSuffixSum, negSuffixSum) {
		return true
	}
	if dfs(idx+1, currentSum, count, vals, minT, maxT, posSuffixSum, negSuffixSum) {
		return true
	}
	return false
}

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	if !scanner.Scan() {
		return
	}
	n, _ := strconv.Atoi(scanner.Text())

	a := make([]int64, 0, n)
	for i := 0; i < n; i++ {
		scanner.Scan()
		val, _ := strconv.ParseInt(scanner.Text(), 10, 64)
		if val != 0 {
			a = append(a, val)
		}
	}

	N := len(a)
	if N == 0 {
		fmt.Println(0)
		return
	}

	valid := make([]bool, 1<<N)
	vals := make([]int64, N)
	posSuffix := make([]int64, N+1)
	negSuffix := make([]int64, N+1)

	for mask := 1; mask < (1<<N); mask++ {
		k := 0
		var S int64 = 0
		for i := 0; i < N; i++ {
			if (mask & (1 << i)) != 0 {
				vals[k] = a[i]
				S += a[i]
				k++
			}
		}
		if k < 2 {
			continue
		}
		if abs(S)%2 != int64(k-1)%2 {
			continue
		}

		minT := (S - int64(k) + 1) / 2
		maxT := (S + int64(k) - 1) / 2

		posSuffix[k] = 0
		negSuffix[k] = 0
		for i := k - 1; i >= 0; i-- {
			posSuffix[i] = posSuffix[i+1]
			negSuffix[i] = negSuffix[i+1]
			if vals[i] > 0 {
				posSuffix[i] += vals[i]
			} else {
				negSuffix[i] += vals[i]
			}
		}

		valid[mask] = dfs(0, 0, 0, vals[:k], minT, maxT, posSuffix, negSuffix)
	}

	dp := make([]int8, 1<<N)
	for mask := 1; mask < (1<<N); mask++ {
		lsb := mask & -mask
		rem := mask ^ lsb
		res := dp[rem]
		
		for subRem := rem; subRem > 0; subRem = (subRem - 1) & rem {
			if valid[subRem|lsb] {
				if cand := dp[rem^subRem] + 1; cand > res {
					res = cand
				}
			}
		}
		
		if valid[lsb] {
			if cand := dp[rem] + 1; cand > res {
				res = cand
			}
		}
		dp[mask] = res
	}

	fmt.Println(N - int(dp[(1<<N)-1]))
}