Python将一个列表中的元素分成两组,使得每组数据之和尽可能的相等

Python将一个列表中的元素分成两组,使得每组数据之和尽可能的相等

# 分离数组
def split_array(arr):
    # 获取数组并排序
    a = list(arr)
    #a.sort()
    # 另一个数组

    b = list()
    # 以上a,b作为待返回的数组

    # 计算数组大小
    n = len(a)#1000

    #求和
    smr = sum(a)

    # 和的一半,简称半和
    hs = smr / 2

    # 临时和
    s = 0

   # 从最大的数字开始遍历数组
    for i in range(-1,0-n,-1):
        # 预判该数字加和结果

        ns = s + a[i]
        if ns > hs:
            # 如果超出半和则跳过
            continue
        else:
            # 如果未超过半和,则:
            # 1, 取该元素加和
            s += a[i]
            # 2, 从 a 中将元素转移到 b
            b.append(a[i])
            a.pop(i)
            # 如果最终和与半和之差,不够最小元素,则完成
            if abs(s - hs) <= a[-1]:
                break
    return a, b

if __name__ == '__main__':
    # 测试:
    # [1,2,3,4,5] -> [1,2,5] & [3,4]
    # arr = test_input()
    print(split_array([118, 299, 472, 485, 468, 392, 515, 800, 982]))

打印结果:
([118, 299, 472, 485, 468, 392, 800], [982, 515])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值