求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:
listB.append(a)
return (listA,listB)
def testSumPlus(tList):
if isinstance(tList,int): #輸入的數爲1個整數時,無法使用len函數
res = tList
else: #輸入的數爲多個整數時,使用len函數計算輸入多的長度
tList = sorted(tList)
listA=tList[-1:]
listB=tList[-2:-1]
for i in range(ln-2,0,-1):
listA,listB=compareSum(listA,tList[i-1],listB)
res=sumList(listA)*sumList(listB)
print(listA, listB,'和的最小差:',abs(sumList(listA)-sumList(listB)))
print('和的最大積:', res)
return res
list1=[2,3,31,30,33]
list2=[2,8]
print(testSumPlus(sorted(list1)))
print(testSumPlus(sorted(list2)))
while(True):
listT =eval(input())
testSumPlus(listT)