帮同学做了道题,附上自己的解答。
他的题目是:
有a,b两序列,大小相同,序列中元素均为正整数,无序。
要求实现:通过交换a,b中的元素,使得 [序列a所有元素的和] 与 [序列b所有元素的和] 之间的差值最小。
这是一个组合问题,我们需要从一个列表里取出一半的元素,然后让这些元素的和最接近原始和的一半。
对于排列组合,python提供了高效迭代器,位于itertools模块。 可以直接暴力枚举。
#coding:utf-8 import itertools def swap_item(a, b): lst = a + b # 合并两个列表 min_diff = sum(lst) half_sum = min_diff / 2 # 原始和的一半 for item in itertools.permutations(lst, len(lst)/2): diff = abs(half_sum - sum(item)) if diff < min_diff: min_diff = diff result = list(item) if diff == 0: break # 如果正好是原始和的一半,即最佳方案 in_lst = [] out_lst = [] for item in set(a + result): a_num = a.count(item) result_num = result.count(item) if a_num < result_num: # 列表A添加该元素 in_lst.append(item * (result_num - a_num)) elif a_num > result_num: # 列表A移除该元素 out_lst.append(item * (a_num - result_num)) print 'A ----->'.ljust(10), '<----- B'.rjust(9) for x,y in zip(out_lst, in_lst): print str(x).ljust(10), str(y).rjust(9) print '\nFinal result is', result a = [19, 90, 1, 2, 3, 52, 11] b = [6, 66, 21, 45, 32, 17, 43] swap_item(a, b)