把一组长度为偶数数列,平均分成2组,怎样分使得|sum(a)-sum(b)|最小。

babykick 2011-07-12 03:51:29
如题:
把一组长度为偶数数列,平均分成2组a和b,怎样分使得|sum(a)-sum(b)|最小。


直觉上似乎要用到DP,用子序列求解,但是感觉子问题和状态转移不好定义,n到n+1的归纳不好搞。

哪位有好的DP解法?当然不是DP的也行。
...全文
315 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
超级大笨狼 2011-07-20
  • 打赏
  • 举报
回复
平均分成2组a和b?
这个题目用DP不需要,就是两贼分赃的例子.
排序后,O(n)分一次,使得前半后半差值Delt小于分界点后边的值.
O(n/2)得到前半小于差值Delt的最大值,加后半去.
重复,直到无数可找
重复部分复杂度是收敛的,最坏找n/2次
总体是O(n*lgn)
ljsspace 2011-07-14
  • 打赏
  • 举报
回复
楼上的, 这里有个反例:
{1,2,3,4,40,98,99,100}。
icessl 2011-07-13
  • 打赏
  • 举报
回复
更正一下:
if (t>=n || 在 Flag[0..t-1] 中已有 n/2 个 1)
{
把Flag[t..n-1]都置成 0;
......
改为
if (t>=n || 在 Flag[0..t-1] 中已有 n/2 个 1 || 在 Flag[0..t-1] 中已有 n/2 个 0)
{
根据 Flag[0..t-1] 中1的个数 把Flag[t..n-1]都置成 0或 1;
.........
icessl 2011-07-13
  • 打赏
  • 举报
回复
该问题不是子集和问题,因为本问题对子集元素个数有限制,只能是n/2.所以,用回溯法求解会方便一些.
char glbBestFlag[N]; // 最优向量,glbBestFlag[i]==0 表示第 i 元素在集合 a
// glbBestFlag[i]==1 表示第 i 元素在集合 b
int glbBestDet; // min(|sum(a)-sum(b)|)
// 初始就是原始集合所有元素绝对值之和

// 算法主体
// 入参: x[] 元素集合,x[0] 首元素 x[n-1] 末元素
// n 元素个数
// Flag[] 当前部分解 Flag[i]=0 表示x[i]在集合 a,否则在集合 b
// t 当前测试元素下标.初始值是 0
int SolveIt(int x[],int n,char Flag[],int t)
{
if (t>=n || 在 Flag[0..t-1] 中已有 n/2 个 1)
{
把Flag[t..n-1]都置成 0;
根据Flag[0..n-1]的内容计算 det=|sum(a)-sum(b)|;
if (det<glbBestDet) // 发现一个更优解
{
glbBestDet=det; // 记录该更优解
glbBestFlag[0..n-1]=Flag[0..n-1];
}
return 0;
}
Flag[t]=0;
SolveIt(x,n,Flag,t+1);
Flag[t]=1;
SolveIt(x,n,Flag,t+1);
return 0;
}

主调函数如下:
char Flag[N];
SolveIt(x,n,Flag,0);
返回时,glbBestDet就是min(|sum(a)-sum(b)|),glbBestFlag[0..n-1]就是解向量.

华芸智森 2011-07-13
  • 打赏
  • 举报
回复
排序.
如:100个数.


SUM(A)=SUM(1:25) +SUM(76:100)
SUM(B)=SUM(26:75)
babykick 2011-07-13
  • 打赏
  • 举报
回复
楼上的回溯法没有prune, 和穷举似乎没区别啊。

babykick 2011-07-12
  • 打赏
  • 举报
回复
谢谢楼上几位,让我获得不少启发。
ljsspace 2011-07-12
  • 打赏
  • 举报
回复
xibeitianlang 2011-07-12
  • 打赏
  • 举报
回复
1、排序;
2、交叉优先权分配,1、4、5,。。。 2、3、6,。。。
3、调整。
例如1,2,3,4,5,10;
1+4+5=10; 2+3+10=15
1和3交换,3-1<(15-10)/2
3+4+5=12 2+1+10=13
cfvmario 2011-07-12
  • 打赏
  • 举报
回复
首先不可能有有效算法,不然不就解决子集和问题了么。

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧