求n个数组随机分成2组子数组使子数组和的乘积最大
思路分析:
2个子数组preA[]和finA[]的总和为sum(a[n])为固定的,要使sum(preA[])*sum(finA[])最大,则子数组和之差要最小,即abs(sum(preA[])-sum(finA[]))最小
逆向推导将n个数组划分到preA和finA中:
1、将长度为n的数组从小到大排序,首先将最大的数放入一个子数组中,倒数第二大数放入另外一个数组中
------>>>a[n-1]放入preA,a[n-2]放入finA
2、从后往前循环遍历剩余数组a[i](a[i]为a[0]~a[n-3]),分别判断该数放入到preA或finA中,判断标准为放入哪个数组使其和之差最小则放到那一组,
---->>>ads(sum(preA,a[i])-sum(finA))和abs(sum(preA)-sum(finA,a[i]))哪个值小
#coding:utf-8
from functools import reduce
def sumList(listTmp): #列表求和函数
return reduce(lambda x, y: x + y, listTmp)
def compareSum(listA,a,listB):
sumA=sumList(listA) #计算子数组A的和
sumB=sumList(listB) #计算子数组B的和
#分别计算将a加入到各子数组中求和
sumNewA=sumA+a
sumNewB=sumB+a
if abs(sumNewA-sumB)<=abs(sumNewB-sumA):
listA.append(a)
else: