注册 登录
编程论坛 C++教室

请高手进来解惑(一个关于数据分组的问题)

wu_qingzhou 发布于 2012-10-18 09:02, 848 次点击
假设有一个数据集A,A中有N个整型数据(可以有重复的数据)。现在要将数据集A分成两组,分别为数据集B和数据集C(B与C中数据个数可以不等)。令sumB为数据集B中的所有数据之和,sumC为数据集C中的所有数据之和。问:要如何分组才能使sumB和sumC之间的差值最小。假设A为{1,3,5,7,8,11,19}。
13 回复
#2
qunxingw2012-10-18 10:27
求总和SumA,求SUmA/2
此数为SumB ,循环累加求和,找SumB,在一个循环里不一定能找到这个数,我有一类似的帖可参考。
#3
wu_qingzhou2012-10-18 10:34
回复 2楼 qunxingw
把帖子连接发一下。
#4
寒风中的细雨2012-10-18 10:55
数据排序  结果就出来了
#5
wu_qingzhou2012-10-18 11:05
回复 4楼 寒风中的细雨
单靠排序怎么出来?
#6
风之子MIKEY2012-10-18 11:29
先排序,然后数据从大到小分组就可以了。
#7
wu_qingzhou2012-10-18 11:33
回复 6楼 风之子MIKEY
这样不能保证sumB和sumC之间的差最小啊。
#8
风之子MIKEY2012-10-18 19:08
#include <iostream>
using namespace std;
void sort(int *a,int b,int c)
{
    int temp=a[b];
    for(int i=b;i<c;i++)
    {
        int max=i;
        for(int j=i+1;j<c;j++)
        {
            if(a[max]<a[j])max=j;
        }
        if(max!=i)
        {
            temp=a[max];
            a[max]=a[i];
            a[i]=temp;
        }
    }
}
int sum(int *a,int b)
{
    int sumb=0;
    for(int i=0;i<b;i++)sumb+=a[i];
    return sumb;
}
main()
{
    int a[10];
    cout<<"plese enter 10 data:";
    for(int i=0;i<10;i++)cin>>a[i];
    sort(a,0,10);
    int b[10],c[10],b_i=0,c_i=0;
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));
    for(i=0;i<10;i++)
    {
        if(sum(b,b_i)>sum(c,c_i))
        {
            c[c_i]=a[i];
            c_i++;
        }
        else
        {
            b[b_i]=a[i];
            b_i++;
        }
    }
    cout<<"b is:";
    for(i=0;i<b_i;i++)cout<<b[i]<<",";
    cout<<"\n c is";
    for(i=0;i<c_i;i++)cout<<c[i]<<",";
    cout<<"\n ";
      return 0;   
   
}
#9
努力学习ing2012-10-18 21:13
回复 8楼 风之子MIKEY
你的试了都对,但是还是想不太明白,你能指点下吗???就是关键部分:
for(i=0;i<11;i++)
    {
        if(sum(b,b_i)>sum(c,c_i))
        {
            c[c_i]=a[i];
            c_i++;
        }
        else
        {
            b[b_i]=a[i];
            b_i++;
        }
    }
为什么这样就可以了???
#10
qunxingw2012-10-19 00:07
以下是引用努力学习ing在2012-10-18 21:13:52的发言:

你的试了都对,但是还是想不太明白,你能指点下吗???就是关键部分:
for(i=0;i<11;i++)
    {
        if(sum(b,b_i)>sum(c,c_i))
        {
            c[c_i]=a;
            c_i++;
        }
        else
        {
            b=a;
            b_i++;
        }
    }
为什么这样就可以了???
因A数已是由大到小排序。扫描这组数时,因b,c初始态相等都是0,此时第一个最大的数保存在B里,再取i=1时,比较B,C的大小,此时B 大,这时第二大数放入C,.....达到B,C相近的目的。
#11
努力学习ing2012-10-19 11:52
回复 10楼 qunxingw
代码看懂了,就是不知道这样的算法为什么是对的...脑筋转不过来
数组分割类型中这中是不是比较简单的?
#12
努力学习ing2012-10-19 11:54
回复 10楼 qunxingw
你说的sun_A/2,我开始也这样想,但是要好多循环,还有部分地方搞不懂,你能发个你帖子的链接吗?
#13
风之子MIKEY2012-10-19 15:04
打个比方,你身上有188元钱,但是是面值不同的钱。100元1张,50元1张,20元1张,10元1张,5元1张,2元1张,1元1张。你会怎么给。
是从大分到小还是从小给到大?不从大分到小你无法达到最公平。我没办法说明理由。
#14
qunxingw2012-10-19 15:49
求与SumA/2最接近的数虽说也能做,但算法太差了。你在我发表的里面找。
1