题目分析:
使用穷举法进行求解,需要使用位运算进行辅助求解。
解题思路:
每一个正整数都可能被分到组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))