两个数组之和的问题

问题1.任意两个相同长度的整形数组,通过交换数组中的若干个元素(交换不改变数组数组长度),使两个数组的和相差最小

问题2.任意一个整形数组,将其划分成两个子数组,要求两个子数组的和相差最小

 

 

对问题1,贪心解似乎更加容易被采纳,即通过多次迭代,每次迭代都从两个数组中各选出一个数,使得两数组的和之差降低最快,但是贪心法看重每次降低最快,却无法覆盖可能几个数组合起来交换的到更优值的情况,所以,还是要尝试动态规划。两个数组元素个数相同,最多交换1/2个元素即可,比如,数组长度为6,则交换4个元素与交换2个元素的差值的绝对值是一样的,所以动态规划上限为1/2元素总数。

 

转换方程状态不是很好想,我想到的是用bit位表示选择情况,两个数组各有相应长度的bit位来记录选择情况,然后每种bit组合对应一个数组和的差值。在某个中间状态时,尝试在前一个状态的某个组合上加入新的pair表示交换元素配对,如果配对能降低差值,则有效,否则无效,迭代的整个过程中随时更新当前最优组合。

 

初始化dp[0]为全0的bit位,并且对应的差值为两数组的和之差的最初值,在迭代过程中,选中了A数组和B数组的m和n元素交换时,{新差值}={原差值}+2*(B[n]-A[m])。

 

 

 

 

对问题2,类似的也可以用bit位作状态记录,初始值取Sum/2,然后迭代选择将差值的绝对值减小的不同组合,取最优解。

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值