##有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
##要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
##有两个序列a,b,大小都为n,序列元素的值任意整形数,无序;
##
##要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小。
#思路,集合到一个列表中,从大到小排序,从大的开始分,分为a,b2个列表。a放第一个,b放第二个,第三个放到哪里,看哪边的合计金额小,放到哪里,继续。
直到一边的长度满了为止。剩下的放到另外一个列表。
原理:大数产生差额,小数填平差额。
def eval_list(a:list,b:list):
if len(a)!=len(b):
print('长度不一致') #类型错误未检测。
return 0
x=sorted(a+b,reverse=True)
c,d=[x[0]],[x[1]]
for i in range(2,len(x)):
print('-len-',len(x),'cs',sum(c),'ds',sum(d),'-c-',c,'-d-',d)
if len(d)<len(a) and sum(c)>sum(d):
d.append(x[i])
elif len(c)<len(a) and sum(c)<=sum(d):
c.append(x[i])
elif len(d)==len(a):
c+=x[i:]
break
elif len(c)==len(a):
d+=x[i:]
break
x=[]
print('sumc',sum(c),'c',c,'\n','sumd',sum(d),'d',d,'\n','最小差额',abs(sum(c)-sum(d)))
eval_list([11,2,55,100,700],[3,600,12,1275,1000])