求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:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值