求n個數組隨機分成2組子數組使子數組和的乘積最大

求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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章