资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
逗志芃在干了很多事情后终于闲下来了,然后就陷入了深深的无聊中。不过他想到了一个游戏来使他更无聊。他拿出n个木棍,然后选出其中一些粘成一根长的,然后再选一些粘成另一个长的,他想知道在两根一样长的情况下长度最长是多少。
输入格式
第一行一个数n,表示n个棍子。第二行n个数,每个数表示一根棍子的长度。
输出格式
一个数,最大的长度。
样例输入
4
1 2 3 1
样例输出
3
数据规模和约定
n<=15
from itertools import *
n = int(input())
a = list(map(str, input().split()))
ans = [] # 储存符合题意的长度
for i in range(1, n): # 拼长棍的数量从1到n-1
for j in combinations(a, i):
a1 = a.copy()
b = sum(map(int, j))
# 每拼成一个,先计算长度,如果长度大于所有长度和的一半,或者改长度已经符合题意,直接跳过
if b > sum(map(int, a)) / 2 or b in ans:
continue
else:
# 如果可以继续计算,先将已经用过的数删掉,这里a1是a的复制品,因为每次都要到,所有不能直接用原数组
[a1.pop(a1.index(k)) for k in j]
for k in range(1, n - i + 1):
num = 0
for m in combinations(a1, k):
# 用剩下的数拼出来的长度如果和与已经拼成的长度相同,则在ans里添加上
if sum(map(int, m)) == b:
ans.append(b)
num += 1
break
if num > 0:
break
print(max(ans)) # 最后输出符合条件的长度最长的一个即可