请高手给点思路?

lkf15080 2009-09-11 01:53:23
给出一列数据,把它们分成两组,
且一组中各数据的和与另一数组
中数据的和的差最小,怎么划分这例数据?
...全文
163 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fantastic99 2009-09-11
  • 打赏
  • 举报
回复
1.先排序啊 排序后 的集合为CA
2.把最大的数移除 放进CB
3.记录差值
4.以后每次移除CA中最小的进入CB 并记录差 如果差值变大了那么将上一步的两组数组返回

就这样啊
haojian11 2009-09-11
  • 打赏
  • 举报
回复
先把一组数据粗略分为两组,然后计算出两组总和的差,此时知道那组数据大,假设大了N。
然后再遍历两组数据,用总和大的数据中的一个 减去 总和小的数据中的一个,找出结果最接近N的两个数。
再把这两个数交换就可以了。

一个减一个还不够的话,可以多个减多个。
haojian11 2009-09-11
  • 打赏
  • 举报
回复
先把一组数据粗略分为两组,然后计算出两组总和的差,此时知道那组数据大,假设大了N。
然后再遍历两组数据,用总和大的数据中的一个 减去 总和小的数据中的一个,找出结果最解决N的两个数。
再把这两个数交换就可以了。

一个减一个还不够的话,可以多个减多个。
mint_wei 2009-09-11
  • 打赏
  • 举报
回复
两个数组和的乘积最小的方向去思考吧。
lkf15080 2009-09-11
  • 打赏
  • 举报
回复
这个题是不是无解啊,也是朋友问我的,他说是一道面试题,哎
mint_wei 2009-09-11
  • 打赏
  • 举报
回复
不过找出来的肯定是最接近总数的一半的。。
重返IT路 2009-09-11
  • 打赏
  • 举报
回复
恩 ,我的算法的确有点问题

而且我的理解 两个子集合是原集合一半的数
bigbug9002 2009-09-11
  • 打赏
  • 举报
回复
确实不对.
1,2,3,4,5,6,7,8,9.

1,2,3,4,5,7
6,8,9
分成这样才行.
mint_wei 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bigbug9002 的回复:]
我不是说了吗?先排序.
[/Quote]

1,3,4,6的话呢?
bigbug9002 2009-09-11
  • 打赏
  • 举报
回复
不过,我确实不敢肯定我说的一定对.
bigbug9002 2009-09-11
  • 打赏
  • 举报
回复
我不是说了吗?先排序.
mint_wei 2009-09-11
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 bigbug9002 的回复:]
排序过序后,把前面的一些数加起来,找与总和的一半相差最小的就可以了吧?
[/Quote]
把前面的数加起来不一定能找到与总和的一半相差最小的
lkf15080 2009-09-11
  • 打赏
  • 举报
回复
4楼的朋友,我觉的你的方法好像不对啊,这个题目要求:
1.把一列数据分我两组
2.每组数据各自相加
3.他们的差最小
如:有一组数据【1,3,6,8,5,6,9,4,5】
1.分为2组【1,3,6,8】和【5,6,9,4,5】
2.每组个数据分别相加为:18和29
3. 29-18=11

这里11肯定不是最小的,怎样分,这个差值才最小
bigbug9002 2009-09-11
  • 打赏
  • 举报
回复
排序过序后,把前面的一些数加起来,找与总和的一半相差最小的就可以了吧?
bigbug9002 2009-09-11
  • 打赏
  • 举报
回复
楼的有问题啊。比如:1,2,3,5000。你的算法就有问题了吧。
重返IT路 2009-09-11
  • 打赏
  • 举报
回复
1.先排序
2.找最大的,和次大的(因为他们之间相差最小)
3.把他们分别加到集合中
4.下次找次大的,和最大的(因为要使各自的集合和相差最小)
5.循环2.直到数据结束为止
重返IT路 2009-09-11
  • 打赏
  • 举报
回复
		int[] nums = {8,7,6,2,0,8,3,5,1,9};
java.util.Arrays.sort(nums);
for (int i = nums.length-1; i >=0 ; i--) {
System.out.print(nums[i]+" ");
}
System.out.println();
List subA = new ArrayList();
List subB = new ArrayList();
long sumA = 0;
long sumB = 0;

List temp;

for(int i=nums.length-1;i>=0;i--){
if(i%2 == 0){
subA.add(nums[i]);
sumA += nums[i];
}else{
subB.add(nums[i]);
sumB += nums[i];
//switch
temp = subA;
subA = subB;
subB = temp;

sumA = sumA ^ sumB;
sumB = sumA ^ sumB;
sumA = sumA ^ sumB;
}
}

System.out.println("subA="+subA+"sum="+sumA);
System.out.println("subB="+subB+"sum="+sumB);
System.out.println("subA-suB="+(sumA-sumB));
lkf15080 2009-09-11
  • 打赏
  • 举报
回复
没有要求,数据直接随便写,^_^,没有思路
chosen0ne 2009-09-11
  • 打赏
  • 举报
回复
两个数组的大小有没有要求?
lkf15080 2009-09-11
  • 打赏
  • 举报
回复
自己顶一个,大侠们给的意见啊

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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