条件

  • 分成两组
  • 两组中各元素加起来的和相等
  • 所有5的倍数必须在其中一个组中
  • 所有3的倍数在另一个组中(不包括5的倍数)
  • 不是5的倍数也不是3的倍数能放在任意一组,可以将数组分为空数组

分析

  1. 既然提到了 5 的倍数和 3 的倍数不能放在一组,那首先要做的就是将数组筛选一遍:5 的倍数放在 A 组,3 的倍数放在 B 组,其余数字放在 C 组等待继续分配
  2. 需要 A 组和 B 组数字的和相等,可以转化为:C 组数字的经过任意的加法和减法计算,最终得到的值,等于 A 组数字之和和 B 组数字之和的差的绝对值

代码

def func2(c, n):
    if not c:
        if n == 0:
            return True
        else:
            return False
        
    c2 = c[:]
    i = c2.pop(0)
    if func2(c2, n+i) or func2(c2, n-i):
        return True
    else:
        return False
    

def func(s):
    a = []  # First group
    b = []  # Second group
    c = []  # Wait
    for i in s:
        if i % 5 == 0:
            a.append(i)
        elif i % 3 == 0:
            b.append(i)
        else:
            c.append(i)

    n = abs(sum(a) - sum(b))
    if sum(c) == n:
        return True
#     elif sum(c) < n:
#         return False
    else:
        return func2(c, n)


input()
s = input().split()
if func(int(_) for _ in s):
    print("true")
else:
    print("false")

# 5
# 1 0 2 3 -2
# true