由于输入int型数组,询问该数组能否分成两组,使得两组中各元素加起来的和相等,数组的和一定为偶数,因为奇数无法分成两个整数的和。此时问题转化为了数组中的数能否凑够N (N =sun(数组)/2) ,条件为数组和不能为奇数。所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),不是5的倍数也不是3的倍数能放在任意一组(le)。 按条件分成3组即好。这时问题就转化为了当起始值为起始值为所有5的倍数的和(3的倍数也可以)依次遍历le,每个数均有两种情况,一种是选择此数,另一种是不选择此数。终止条件为 当不断累加选择数的s等于N。若可以得到N,成功,得不到失败

def fun(le, N, s):
    for i in range(len(le)):
        if s + le[i] == N:  # 终止条件:当已经叠加的总和等于N时,结果成立
            return True
        else: # 两种情况一种成立即为True,
            return fun(le[i + 1:], N ,s + le[i]) or fun(le[i + 1:], N ,s)
    return False  # 遍历数组均未成功时,结果失败


while True:
    try:
        a, l = input(), list(map(int,input().split()))
        s1, s2, le = 0, 0, []
        if sum(l) % 2 != 0:  # 数组和为奇数时无法平均分组。false
            print('false')
        else:  # 按条件把所有5的倍数放在一个组中并求和、所有3的倍数放在一个组中并求和、剩余数放在一个组中
            for i in l:
                if i % 5 == 0:
                    s1 += i
                elif i % 3 == 0:
                    s2 += i
                else:
                    le.append(i)
            sum_le = sum(le)
            if len(le) == 0:  # 若 仅有5、3的倍数,没有其他任何数字时,判断此时两个数组的大小。不等则false
                if s1 != s2:
                    print('false')
                else:
                    print('true')
            else:
                N = sum(l) // 2  # N为数组中所有数值和的一半,若s1或者s2与le数组中的某些数组成N。
                if fun(le, N, s1):
                    print('true')
                else:
                    print('false')
    except:
        break