# 这道题是比较折磨的对于递归不熟悉的本人来说 # 1,先将数组分成三个组,five为被5整除的数,three为被3整除的数,other为其他。 # (这里用if和elif就包含了逻辑顺序,即题中所说的先让5去挑,“被3整除的数中不包含5”) # 2,我们要做到事情很简单,即将other里的元素任意分配给five和three, # 最终我们检验两个必要条件,other要全部分完,即other的长度为0,并且five和three的和相等 # 3,与递归无关的痛苦在于,怎么分?是的,这似乎没有任何答案说明,这里就是粗暴的枚举法 # (其实个人感觉跟粗暴不搭界源于数学基础),other里的每一个元素,只有两种可能, # 要么给five要么给three,这样想通了就是2的len(other)次方中可能性, # 所有的可能性融于计算这种分配的过程,和导致的很多的组合 # 已知3中的计算分配方法,如何求出这些可能呢? 递归就是不断重复一个操作,直到满足我们的一个状态 # 4,既然是other里的每一个元素都人人有份必须二选一的可能抛出去,我们就很容易联想到逐一分配如pop之类 # 5,所以我们设计一个函数叫cal,它的终极任务是,如果判断other为空后,判断两组和是否相同, # 是则输出True否之相反;那么递归的不满足的开启条件是什么呢?other不为空,只要你不为空, # 就必须一直重复cal,且一旦发现不为空,就产生两种结果(other抛球给five或者抛给three) def cal(five,three,other): if len(other)==0: if sum(five) == sum(three): return True else: return False while len(other)>0: return cal(five+other[:1],three,other[1:]) or cal(five,three+other[:1],other[1:]) while True: try: n=int(input()) box = map(int,input().split()) five,three,other=[],[],[] for each in box: if each % 5 ==0: five.append(each) elif each % 3 ==0: three.append(each) else: other.append(each) if cal(five,three,other): print('true') else: print('false') except: break