题目:将一个没有排序,元素个数为2n的正整数数组,分割为元素个数为n的两个数组,使两个子数组的和最接近。
问题转换:从一个数组中找到和最接近给定值的一组元素。
思路:
o(2n)算法:
举例1:S中前n个元素中任意i(0,1…n)个元素的可能和的集合
s={1,4,5}:
F0 = {0}; //没有元素
F1 = {0,1}; //s中前1个元素,可能的和集合
F2 = {0,1,4,5}//s中前2个元素,可能的和集合
F3 = {0,1,4,5,6,9,10} //s中前3个元素,可能的和集合
举例2:S中前n个元素中i(特定)个元素的可能和的集合
对于第一个元素:1
Heap[0] = {0}
Heap[1] = {1}
对于第二个元素:4
Heap[2] = {5}
Heap[1] = {4}
对于第三个元素:5
Heap[3] = {10}
Heap[2] = {6,9}
Heap[1] = {5}
综合上述:Heap[0]={0}, //s中0个元素的和集合
Heap[1]={1,4,5}, //s中1个元素的和的集合
Heap[2]={5,6,9}, //s中2个元素的和的集合
Heap[3]={10} //s中3个元素的和的集合
本题:求2*n个元素中n个元素的所有可能的和的集合:Heap[n]
伪码实现:
for(k=1; k<=2*n; k++){
i_max = min(k-1,n-1);
for(i=i_max; i>=0; i--){
for each v in Heap[i]
insert(v+arr[k],Heap[i+1])
}
}
改进算法:
Heap[i]保存i个数所有可能和集合=>isOk[i][v]=true/false(是否有i个数的和为v)
for(k=1; k<=2*n; k++){
i_max = min(k-1,n-1);
for(i=i_max; i>=0; i--){
for(v=1; v<=sum/2; v++){
if(v >= arr[k] && isOk[i-1][v-arr[k]])
isOk[i][v] = true;
}
}
}
时间复杂度为:o(n*n*sum)
当sum不大,可以采用此方法。
分享到:
相关推荐
给定一个有 n 个整数的数组,你需要找到满足以下条件的三元组 (i, j, k) :子数组 (0, i - 1),(i + 1, j - 1),(j + 1,
数组分割问题(印象深刻)1
3. #include "CreateArray.h" //该头文件是动态开辟及销毁二维三维数组的,读者自己实 4. using namespace std 1
最长上升子序列 编辑距离问题、货物堆积问题、骑士周游问题、数组分割问题、资源分配问题、最长上升子序列问题
C语言实验报告 包括合并数组、分割数组、打开文件并输入字符个数、员工信息管理程序
资源名:分割元胞数组_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导或者更换。 适合人群:新手及有一定经验的开发人员
生成数组的相关函数的语法以及用法,字符节的相关转化,索引以及分割函数
分割数组算法分割数组算法分割数组算法分割数组算法分割数组算法分割数组算法
主要介绍了php使用array_chunk函数将一个数组分割成多个数组,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
array_change_key_case -- 返回字符串键名全为小写或大写的数组 array_chunk -- 将一个数组分割成多个 array_combine -- 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值 array_count_values -- ...
上一篇文章,我们将text中的数据插入到了textarea中,后台就需要处理,在textarea中,回车符不是“n”,应该是chr(13)。
易语言-易语言文字分割_到数组源码
arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。 我们最多能将数组分成多少块?
快速排序算法的编码和优化 快速排序的基本思路是: ...2. 通过递归的处理, 再对原数组分割的两部分分别划分为两部分,同样是使得其中一部分的所有数据都小于 另一部分的所有数据。 这个时候原数组被划分为了4份
是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200 示例 1: 输入: [1, 5, 11, 5] 输出: true 解释: 数组可以分割成 [1, 5, 5] 和 [11]. ...
数组分割 函数 数组及操作 np.split 将一个数组分割为多个子数组 np.hsplit 将一个数组水平分割为多个子数组(按列) np.vsplit 将一个数组垂直分割为多个子数组(按行) np.dsplit 在第三个轴上进行...
20 数组优化-数组分割 67 20.1 数组接口 67 20.2 数组分割 67 21 数组优化-数组映射和重组 69 21.1 数组的映射 69 21.2 数组的重组 72 21.3 综合对比 72 22 数组优化-其他优化方法 72 22.1 定义ROM 72 22.2 数组的...
php分割数据,数组,分割字符串循环输出 $array_x="1,15,8,100"; $new_arr = explode(",",$array_x); $length = sizeof($new_arr); for($i=0;$i<$length;$i++){ if($i!=0){echo " ";} echo $new_arr[$i]; }?>