数组分成两组差值最小 python_将数组分成两部分使得两部分的和的差最小

题目有点拗口,举个例子,有1,2,3一共3个数,将这三个数分成两部分,有3种分法1 | 2,3或者1,2| 3 或者1,3|2,然后计算每部分所有数的和,

1 | 2,3 -> 和为1,5,和的差是4

1 2| 3 -> 和为3,3,和的差是0

1 3|2 -> 和为4,2,和的差是2

所以按照1,2| 3分得到的和的差最小。

那么任意给定一个数组,如何找出最小值呢?

思路:差最小就是说两部分的和最接近,而且和所有数的和SUM的一半也是最接近的。假设用sum1表示第一部分的和,sum2表示第二部分的和,SUM表示所有数的和,那么sum1+sum2=SUM。假设sum1

所以我们就有目标了,使得sum1<=SUM/2的条件下尽可能的大。也就是说从n个数中选出某些数,使得这些数的和尽可能的接近或者等于所有数的和的一般。这其实就是简单的揹包问题了:

揹包容量是SUM/2. 每个物体的体积是数的大小,然后尽可能的装满揹包。

dp方程:f[i][V] = max(f[i-1][V-v[i]]+v[i], f[i-1][V] )

f[i][V]表示用前i个物体装容量为V的揹包能够装下的最大值,f[i-1][V-v[i]]+v[i]表示第i个物体装进揹包的情况,f[i-1][V]表示第i件物品不装进揹包的情况。

按照dp方程不难写出代码:

初始值:f[0][k]=0,f[i][0]=0;

for(i=0;i

{

for(j=1;j

{

f[i][j]=f[i-1][j];

if(v[i]<=j && f[i-1][j-v[i]]+v[i]>f[i][j]){

f[i][j]=value[i-1][j-v[i]]+v[i];

}

}

最终差值就是SUM-2*f[n-1][SUM/2];

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用\[1\]和引用\[2\]的内容,我们可以使用状态压缩法来枚举所有可能的分组情况。对于给定的数组,我们可以将每个元素放入数组1或数组2中,用二进制的1和0来表示。然后,我们可以计算每种分组情况下数组的和之的绝对值,并找到最小差值。 举个例子,对于输入数组nums = \[2,-1,0,4,-2,-9\],我们可以将其分成 \[2,4,-9\] 和 \[-1,0,-2\] 数组,它们的和之的绝对值为 abs((2 + 4 + -9) - (-1 + 0 + -2)) = 0。这就是最优的分组方案。 因此,我们可以通过枚举所有可能的分组情况,并计算每种情况下的差值,找到最小差值来实现将数组分成数组,并最小数组和的。 #### 引用[.reference_title] - *1* [2035. 将数组分成数组最小数组和的 折半搜索](https://blog.csdn.net/yu_duan_hun/article/details/125899854)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [[Leetcode]5897. 将数组分成数组最小数组和的](https://blog.csdn.net/gshgsh1228/article/details/120692058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值