数组分割
来源:互联网 发布:手机淘宝5.6.0 编辑:程序博客网 时间:2024/06/14 06:38
题目描述:
有一个没有排序,元素个数为2n的正整数数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组的和最接近。
分析:
题目的本质就是要从2n个整数中找出n个,使得它们的和尽可能地靠近所有整数之和的一半。
解法一和二:
伪代码如下:
定义:Heap[i]表示存储从arr中取i个数所能产生的和之集合的堆。
初始化:Heap[0]只有一个元素0,Heap[i], i > 0 没有元素。
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[0]只有一个元素0,Heap[i], i > 0 没有元素。
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]);
}
}
解法三:
代码如下:
定义:isOK[i][v]表示是否可以找到i个数,使得它们之和等于v
初始化:isOK[0][0] = true;
isOK[i][v] = false(i > 0, v > 0);
for (k = 1; k < 2 * n; k++)
{
for (i = 1; (i <= k&&i <= n); i++)
for (v = 1; v <= Sum / 2; v++)
if (v >= arr[k] && isOK[i - 1][v - arr[k]])
isOK[i][v] = true;
}
初始化:isOK[0][0] = true;
isOK[i][v] = false(i > 0, v > 0);
for (k = 1; k < 2 * n; k++)
{
for (i = 1; (i <= k&&i <= n); i++)
for (v = 1; v <= Sum / 2; v++)
if (v >= arr[k] && isOK[i - 1][v - arr[k]])
isOK[i][v] = true;
}
利用如上的算法,时间复杂度为O(N2*Sum).N2指n的平方。
0 0
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 数组分割
- 解题报告 之 ZOJ2332 Gems
- Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置
- 浙江 美女跑路老板 从非洲押解回国(图)
- PHP设计模式——原型模式
- hdu1247-字典树,单词拆分
- 数组分割
- 黑马程序员——Java基础:多线程及其应用
- 读写EXCEL
- Demacia of the Ancients
- Windows7如何开启telnet服务
- 12th浙江省省赛 B题 Beauty of Array
- 用三个步骤实现响应式网页设计
- npm基础
- tab的实现微信界面