输入int型数组,询问该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),不是5的倍数也不是3的倍数能放在任意一组,可以将数组分为空数组,能满足以上条件,输出true;不满足时输出false。
数据范围:每个数组大小满足 1 ≤ n ≤ 50 1 \le n \le 50 1≤n≤50,输入的数据大小满足 ∣ v a l ∣ ∣ ≤ 500 |val||\le 500 ∣val∣∣≤500
第一行是数据个数,第二行是输入的数据
返回true或者false
写递归函数,几乎全排列计算结果.
超时,用例通过24/26
n=int(input())
number_list=[int(x) for x in input().split()]
G1,G2=[0,],[0,]
# 5的倍数放在G1,3的倍数但不是5的倍数放在G2
for x in number_list:
if x%5==0:
G1.append(x)
elif x%3==0:
G2.append(x)
tmp_list=number_list[:]
# number_list删去3和5的倍数
for x in tmp_list:
if x%3==0 or x%5==0:
number_list.remove(x)
res=[0,]
def f(L1,L2,L):
# 列表L为空时,结束递归,计算并记录结果
if L==[]:
if sum(L1)==sum(L2):
res.append(1)
return 'finish'
# L非空且还没有true结果时,继续分配数组
if len(res)==1:
for i in range(len(L)):
tmp_L1=L1[:]
tmp_L2=L2[:]
tmp_L=L[:]
del tmp_L[i]
tmp_L1.append(L[i])
f(tmp_L1,L2,tmp_L)
tmp_L2.append(L[i])
f(L1,tmp_L2,tmp_L)
f(G1,G2,number_list)
flag=sum(res)
if flag>0:
print('true')
else:
print('false')
在代码1的基础上,在分配数组时,采用比较大小的方法进行分配。可以减少一些递归次数
用例通过25/26
n=int(input())
number_list=[int(x) for x in input().split()]
G1,G2,G=[0,],[0,],[]
# 5的倍数放在G1,3的倍数但不是5的倍数放在G2,都不是的放在G
for x in number_list:
if x%5==0:
G1.append(x)
elif x%3==0:
G2.append(x)
else:
G.append(x)
res=[0,]
def f(L1,L2,L):
# 列表L为空时,结束递归,计算并记录结果
if L==[]:
if sum(L1)==sum(L2):
res.append(1)
return 'finish'
# L非空且还没有true结果时,继续分配数组
if len(res)==1:
for i in range(len(L)):
tmp_L1=L1[:]
tmp_L2=L2[:]
tmp_L=L[:]
n1,n2=sum(L1),sum(L2)
del tmp_L[i]
if (n1<=n2 and L[i]>=0) or (n1>n2 and L[i]<0):
tmp_L1.append(L[i])
f(tmp_L1,L2,tmp_L)
elif (n1<=n2 and L[i]<0) or (n1>n2 and L[i]>=0):
tmp_L2.append(L[i])
f(L1,tmp_L2,tmp_L)
f(G1,G2,G)
flag=sum(res)
if flag>0:
print('true')
else:
print('false')