| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4597 人关注过本帖
标题:[讨论] 一个2n的整数数组,分成个数相等的两组,保证两组和之差的绝对值最小 ...
只看楼主 加入收藏
steelking
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-9-19
收藏
 问题点数:0 回复次数:7 
[讨论] 一个2n的整数数组,分成个数相等的两组,保证两组和之差的绝对值最小

一个2n的整数数组,现要分成个数相等的两组,每组 n 个整数。

设计算法,保证两组和之差的绝对值最小
搜索更多相关主题的帖子: 整数 绝对值 相等 
2007-09-19 15:43
yushui
Rank: 3Rank: 3
等 级:论坛游民
威 望:7
帖 子:1355
专家分:22
注 册:2006-7-19
收藏
得分:0 

先把这个数求和 再除2 得到的两个数 然后while循环 拿一个数随机取n个数 这n个的和相加等于这个数 再对另个数取n个数 遇到和前面相同的重取 看有没有这n个 没有就重新循环 有就跳出

不知道能不能实现 有点笨 这办法 我也想不出 呵呵


fighting!from now on!
2007-09-19 19:05
ACKing
Rank: 1
等 级:新手上路
帖 子:69
专家分:0
注 册:2007-9-4
收藏
得分:0 
I think this problem is an NPC
2007-09-20 00:40
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 

1楼说的头一句应该没错,首先确定平均值。然后的分配就是一个典型的组合优化问题,好像真的是NP难的


努力成为菜鸟!
2007-09-20 08:16
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 
补充一点,如果效率优先、并只求近似解的话,可以有一个O(n^2)的算法。

for(i=0;i<2n;i+=2)
{
以当前值为标准,在剩余的数组中(第一次循环时则是全数组)找到与其值最近的元素;
将两元素分别放入两子数组;(在不加大复杂度的前提下,可以稍微提高点精度,就是若上一次子数组a的值小的话,本次循环则把大值放入a)
}

当然,这是一种典型的贪心算法思想,只能得到近似解。要得到精确解的话,应该是个NP-hard问题

努力成为菜鸟!
2007-09-20 08:23
dlgdd
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2007-9-18
收藏
得分:0 
这样不知道行不行:
1.先把两组数的和求出来进行比较,得出这两组数的和的差值A1,
2.再在两个数组中分别找到一个数,使它们的差小于A1,对他们进行调换.
3.重复1,2步的操作直到找不到满足条件的数
2007-09-20 16:39
cobby
Rank: 1
等 级:新手上路
威 望:1
帖 子:565
专家分:0
注 册:2007-7-11
收藏
得分:0 

楼上的算法理论上可以得到精确解,但是也是一个NP难的算法。呵呵,典型的穷举嘛


努力成为菜鸟!
2007-09-20 18:36
steelking
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-9-19
收藏
得分:0 



这有一种思想:不停的交换两部分之间的元素,使得这两部分之间的和之差越来越小。



#include<stdio.h>
#include<math.h>
#include<stdlib.h>

void change(int *x, int * y)
{
int temp=*x;
*x=*y;
*y=temp;
}

int main()
{
int a[4]=
{
4,2,3,6
};
int b[4]=
{
10,11,15,19
};

int i,j;
int sumA=0;
int sumB=0;

for(i=0;i<4;i++)
{
sumA+=a[i];
sumB+=b[i];
}


int ab_diff=abs(sumA-sumB);


for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
sumA=sumA-a[i]+b[j];
sumB=sumB+a[i]-b[j];
if ( abs(sumA-sumB) > ab_diff )
{
sumA=sumA+a[i]-b[j];
sumB=sumB-a[i]+b[j];
}
else
{
change(a+i, b+j);
ab_diff = abs(sumA-sumB); //更新差值
}
printf("%d,%d\n",sumA,sumB);
}
}

for(i=0;i<4;i++)
{
printf("%d ",a[i]);
}

printf("\n");

for(i=0;i<4;i++)
{
printf("%d ",b[i]);
}

return 1;

}


2007-09-21 11:54
快速回复:[讨论] 一个2n的整数数组,分成个数相等的两组,保证两组和之差的绝对 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.012033 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved