https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86?tpId=37&tags=&title=&diffculty=0&judgeStatus=0&rp=1
# -*- coding: utf-8 -*-
# !/usr/bin/python3
# 解题思路:先按提干要求构建ls1和ls2,计算ls1和ls2总和之差的绝对值t,用ls3抹平两者差距;
# 问题变成了:ls3的总和减去t之后的值d,d能否被ls3中元素平分。如果d是奇数,那么一定不能平分。
# 如果d是偶数,那么变了成能不能从ls3中挑选出若干元素,他们的和为d/2,与打靶问题有类似之处;
# 但是本题比打靶问题简单,打靶问题每次射击的结果从0到10有11种情况,本地只有两种情况
# 分解子问题:
# 使用递归开始查找,对ls3中的每个元素遍历,每个元素都分两种情况:参与构建d/2和参与构建d/2;
# 形成一个二叉树,记录查找结果;
# 边界条件:
# 1.如果target为0了,那么说明找到了一个构建d/2的方法
# 2.如果ls3都查找完了还没有找到,说明没有办法构建d/2
# 本题也可以使用动态规划实现: dp[i][j]表示ls3中前一个元素能否构建j
# 状态转义方程式:dp[i][j] = dp[i - 1][j] or dp[i - 1][j - ls3[i]]
def search(ll, target):
# 能不能从从l1中挑出若干元素,是的和为target
if target == 0:
return True
if not ll:
return False
# 第一个元素不挑 或者 第一个元素挑
return search(ll[1:], target) or search(ll[1:], target - ll[0])
while True:
try:
m = int(input())
ls = list(map(int, input().split()))
ls1 = []
ls2 = []
ls3 = []
for i in ls:
if i % 5 == 0:
ls1.append(i)
elif i % 3 == 0:
ls2.append(i)
else:
ls3.append(i)
t = abs(sum(ls1) - sum(ls2))
d = sum(ls3) - t
if d % 2 != 0:
print('false')
else:
if search(ls3, d/2):
print('true')
else:
print('false')
except:
break