题解 | #数组分组#

数组分组

https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86

python求解思路,就是先提取5和3的数,求出数组差,最后根据数组差可以计算出剩下的数组需要分裂出的数组和应该是多少,问题就转化为全排列找target和的问题,注意一下剪枝,比如说假如说target都不是整数,直接就可以输出false了,计算过程中发现有target了,那就可以停止排列输出了
n = int(input())
array = list(map(int,input().split(" ")[:n]))
arrfive = 0
arrthree = 0
arrlost = [] 
lostsum = 0
for i in array:
    if i%5 == 0:
        arrfive += i
    elif i%3 == 0:
        arrthree += i
    else:
        lostsum += i
        arrlost.append(i)
#arrlost内的数全排列,找出总和差距为abs(arrfive-arrthree)的数组
arrlost.sort(reverse=False)#从小到大排列
#arrlost分裂的数组和为lostsum,差为abs(arrfive-arrthree)
#所以只需要寻找和为(lostsum+abs(arrfive-arrthree))/2的数组
target = (lostsum+abs(arrfive-arrthree))//2#这就是下一步目标
if (lostsum+abs(arrfive-arrthree))%2 != 0:
    print('false')
else:   
    allsum = set()
    allsum.add(0)
    if target == 0:#假如说target就等于0,那直接就true了,毕竟可以空集
        print('true')
    else:
        for i in arrlost:#全排列,计算和
            temp = set()
            for j in allsum:#增加i,所以之前的和全部加i
                temp.add(j+i)
            if target in temp:#假如说正在算的时候发现有target了,直接输出
                print('true')
                allsum = allsum | temp
                break
            allsum = allsum|temp#加i和不加i的并一下就是i时的全排列组合的和
        if target not in allsum:#算的时候没发现有值,最后象征性得再找一下,实在没有就false
            print('false')


全部评论

相关推荐

头像
10-16 09:58
已编辑
门头沟学院 Java
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务