将数组分成两部分使得两部分的和的差最小
题目有点拗口,举个例子,有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<sum2 那么SUM/2-sum1 = sum2-SUM/2;
所以我们就有目标了,使得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<n;i++){for(j=1;j<SUM/2;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];
将数组分成两部分使得两部分的和的差最小相关推荐
- LeetCode 2035. 将数组分成两个数组并最小化数组和的差(状态压缩DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个长度为 2 * n 的整数数组. 你需要将 nums 分成 两个 长度为 n 的数组,分别求出两个数组的和,并 最小化 两个数组和之 差的绝对值 ...
- 背包问题变种:将数组分成两部分使得两部分的和的差最小
题目: 将一个数组分成两部分,不要求两部分所包含的元素个数相等,要求使得这两个部分的和的差值最小.比如对于数组{1,0,1,7,2,4},可以分成{1,0,1,2,4}和{7},使得这两部分的差值最小 ...
- python数组分成两个和相等的子集_javascript,_动态规划——把一个整数数组分成两个和相等的子集,怎么写,javascript - phpStudy...
动态规划--把一个整数数组分成两个和相等的子集,怎么写 当数组nums=[2,3,5]时,测试通过,但当nums=[5,3,2]时,测试就不能通过,这是为什么? window.onload = fun ...
- LeetCode 2035. 将数组分成两个数组并最小化数组和的差
文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.算法详解 3.时间复杂度 4.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述 给你一个 ...
- (笔试题)将数组分成两组,使两组的和的差的绝对值最小
题目: 数组中的数分为两组,给出一个算法,使得两个组的和的差的绝对值最小数组中的数的取值范围是0<x<100,元素个数也是大于0,小于100 比如a[]={2,4,5,6,7},得出的两组 ...
- 【LeetCode 剑指offer刷题】数组题2:57 有序数组中和为s的两个数(167 Two Sum II - Input array is sorted)...
[LeetCode & 剑指offer 刷题笔记]目录(持续更新中...) 57 有序数组中和为s的两个数 题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是 ...
- 求以下double数组的平均值(四舍五入保留两位小数):
import java.math.BigDecimal;/*** 求以下double数组的平均值(四舍五入保留两位小数):* double[] arr = {0.1,0.2,2.1,3.2,5.56, ...
- scala 数组合并_Scala程序合并两个数组或数组缓冲区
scala 数组合并 Scala | 合并两个数组 (Scala | Merging two arrays) Arrays are important data structures in progr ...
- java数组的扩容,将两个数组合并成一个数组
java数组的扩容,将两个数组合并成一个数组 //将下列两个数组合成一个数组 public class Test04 {public static void main(String[] args) { ...
- 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)
题目描述 给定一个整数数组,找出其中两个数相加等于目标值输入 [1,3,5,7,9,11] 10输出 1,9 3,7 代码: import java.util.HashMap; import java ...
最新文章
- Linux 中ifconfig和ip addr命令查看不到ip解决方法
- 颜宁教授当年若当选科学院院士,她还会出走清华吗?
- 31 天重构学习笔记28. 为布尔方法命名
- 11kw星三角启动延时几秒_电机星三角降压启动接线方法图解
- ansible-playbook 手工编译安装nginx
- django 1.8 官方文档翻译: 3-6-1 中间件概览
- 读后感:软件测试经验与教训
- 随想录(写给那些学校不是985、211的同学们)
- new和delete创建和销毁二维数组
- 帆软报表设计器菜单栏介绍之二文件菜单
- 数据--第35课 - 创建二叉树
- oracle rman异地备份,rman异地备份与恢复测试
- B站左程云算法视频中级班01
- 2021中国科学院文献情报中心期刊分区表 计算机
- 多家银行手机转账现高危漏洞 ,用户资金或被非法窃取
- Android开发之使用Web Service进行网络编程
- Nand2Tetris 计算机结构
- Log4j2维护者吐槽没工资还要挨骂!!!
- 能提取HTML网页正文的网站,智能提取网页正文新方法
- IBM bladecenter H刀箱BladeCenter北电交换机VLAN配置