首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

100题_32 两个序列的和的差最小

作者:  时间: 2011-03-21

有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b 中的元素,使[序列a 元素的和]与[序列b 元素的和]之间的差最小。
例如:
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];

 

这个题可以用递归的思想来解决:

首先将这两个数组合成一个数组,并按从小到大的顺序排序,取出最大的和次大的。将剩余的2n-2个元素递归分成两个和的差最小的两部分。这样和比较小的加上最大的那个元素和和比较大的加上次大的元素将是整个序列的最小和差划分,可以用数学归纳法来证明。

 

代码如下(Python):

def mean(sorted_list, list_b = []):
if list_b:
sorted_list.extend(list_b)
sorted_list.sort()

if not sorted_list:
return ([], [])

big_list,small_list = mean(sorted_list[:-2])

big_list.append(sorted_list[-2])
small_list.append(sorted_list[-1])

if sum(big_list) > sum(small_list):
return (big_list, small_list)
else:
return (small_list, big_list)

def main():
a = [100, 98, 99, 1, 2, 3]
b = [1, 2, 3, 4, 5, 40]
big, small = mean(a, b)
print(big)
print(small)

if __name__ == '__main__':
main()