python实现数的分组(将任意10个正整数分为2组A和B,要求组A中每个数据的和与组B中每个数据的和之差的绝对值最小)

题目分析:
使用穷举法进行求解,需要使用位运算进行辅助求解。

解题思路:
每一个正整数都可能被分到组A或者是组B,因此总共所有的分组有为2*10 = 1024种可能,去掉组A或者组B为None的情况,总共有1024-2=1022种情况。如果直接用循环体嵌套去遍历每一种情况,需要嵌套10个循环体,这对于代码书写太过复杂了,不可行。
因为要分为两组,我们很自然的想到0和1,因此本题正确的解法应使用位运算去解决这个问题:
假设10个整数中被分到数组A的我们记其为1,分到数组B的我们记其为0,例如:1011100000代表第1,3,4,5个整数被分到了数组A中,其他整数被分到了数组B中。由此,我们可以写一个循环体来通过位运算的&来判断10个整数的分组。遍历所有的情况,便可得出答案。

代码如下:

def shudefenzu(a):
    min = max(a)
    for i in range(1, 1022):
        sum1 = 0
        sum2 = 0
        for j in range(10):
            if i & (2 ** j) != 0:
                sum1 += a[j]
            else:
                sum2 += a[j]
        if abs(sum1 - sum2) < min:
            min = abs(sum1 - sum2)
            l1 = []
            l2 = []
            for j in range(10):
                if i & (2 ** j) != 0:
                    l1.append(a[j])
                else:
                    l2.append(a[j])
    return l1, l2


if __name__ == '__main__':
    a = [2, 3, 9, 6, 10, 8, 0, 23, 16, 65]
    print(shudefenzu(a))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值