条件
- 分成两组
- 两组中各元素加起来的和相等
- 所有5的倍数必须在其中一个组中
- 所有3的倍数在另一个组中(不包括5的倍数)
- 不是5的倍数也不是3的倍数能放在任意一组,可以将数组分为空数组
分析
- 既然提到了 5 的倍数和 3 的倍数不能放在一组,那首先要做的就是将数组筛选一遍:5 的倍数放在 A 组,3 的倍数放在 B 组,其余数字放在 C 组等待继续分配
- 需要 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