题目博客:
http://blog.youkuaiyun.com/v_JULY_v/article/details/6057286
题目:
有两个序列a,b,大小都为n,序列元素的值任意整数,无序;
要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
例如:
var a=[100,99,98,1,2, 3];
var b=[1, 2, 3, 4,5,40];
。。。。卡这么好久了。。
总是写不出列表的组合来。看了别人写组合的代码,突然发现好简单啊。。
这是别人组合的代码:
def combine(l,n):
answers=[]
one=[0]*n
def next_c(li=0,ni=0):
if ni==n:
answers.append(copy.copy(one))
return
for l_index in xrange(li,len(l)):
one[ni]=l[l_index]
next_c(l_index+1,ni+1)
next_c()
return answers
#coding=utf-8
'''
Created on 2014��5��28��
@author: Administrator
'''
import itertools
import math,random,copy
def combine(l,n):
#获取列表l n个元素的组合列表
answers=[]
one=[0]*n
def next_c(li=0,ni=0):
if ni==n:
answers.append(copy.copy(one))
return
for l_index in xrange(li,len(l)):
one[ni]=l[l_index]
next_c(l_index+1,ni+1)
next_c()
return answers
if __name__ == '__main__':
in_list1,in_list2=[100,99,98,1,2,3],[1,2,3,4,5,40]
#out_list1,out_list2=GetMinSubList(in_list1, in_list2)
total_list=list(itertools.chain(in_list1,in_list2))
total_list.sort(reverse=True)
avg_sum=sum(total_list)/2.0#和的平均值
min_subvalue=avg_sum#与和平均值的差值
out_list1,out_list2=None,None
for tmp_list in combine(total_list,5):
if math.fabs(sum(tmp_list)-avg_sum)<min_subvalue:
min_subvalue,out_list1=math.fabs(sum(tmp_list)-avg_sum),tmp_list
out_list2=total_list[:]
for value in out_list1:
out_list2.remove(value)
print sum(out_list1)-sum(out_list2)
#print combine([1,2,3],2)
运行结果为:
44