HJ93 数据分组【python3】

题目描述

输入int型数组,询问该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),不是5的倍数也不是3的倍数能放在任意一组,可以将数组分为空数组,能满足以上条件,输出true;不满足时输出false。

数据范围:每个数组大小满足 1 ≤ n ≤ 50 1 \le n \le 50 1n50,输入的数据大小满足 ∣ v a l ∣ ∣ ≤ 500 |val||\le 500 val∣∣500

输入描述

第一行是数据个数,第二行是输入的数据

输出描述

返回true或者false

代码&思路

代码1

写递归函数,几乎全排列计算结果.

超时,用例通过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')


代码2

在代码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')


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值