将一组数随意分成三份,求每一份的和,要求最大和与最小和相差最小的算法,在线等,求大神指教!

2025-05-20 21:06:25
推荐回答(1个)
回答(1):

假设输入的所有数据是正整数(有负数的情况会比较复杂,之后讨论),存储在数组unsigned int input[m]里,数组长度是m,从0到m-1是所有数。
你需要一个排序算法将input[]从小到大排列,最小的input[0]。
使用三个变量保存三组数的和,称为sum[0],sum[1],sum[2],把输入数字从大到小依次放入当前三个和中最小的那一个,直到所有数字放完,最大的和最小的之间的差就是结果。
使用C语言的话如下:
int mindiff(unsigned int input[], int length) //此时input是排序完毕的,length是数组长度

{
if(length<1)
return -1;//出错,数组长度太短
if(length==1)
return input[0];//只有一个数,该数就是最小差
if(length==2)
return input[1];//只有两个数,较大的就是最小差
if(length==3)
return input[2]-input[0];//只有三个数,最大的减最小的是最小差

int sum[3]={input[length-1],input[length-2],input[length-3]};
int minSumIndex=2;//当前最小的和是sum[2]
for(int i=length-4;i>=0;i--)//从第四大的数开始
{
sum[minSumIndex]+=input[i];
minSumIndex=getMinSumIndex(sum);
}
if(sum[(minSumIndex+1)%3]>sum[(minSumIndex+2)%3])
return sum[(minSumIndex+1)%3] - sum[minSumIndex];
else
return sum[(minSumIndex+2)%3] - sum[minSumIndex];
}

int getMinSumIndex(int sum[])
{
int index=0
if(sum[1] index=1;
if(sum[2] index=2;
return index;
}

以上这样对于正整数输入应该就没问题了,当然如果带有小数,就把声明变成float或者double就行了。

但是对于负数的情况,这个算法显然就不太适用了。就要完全使用另一种思路。
假设输入中带有复数,可以先计算所有输入数据的总和,然后把绝对值大于这个总和绝对值的数单独挑出来,如果不存在的话,那把所有输入数据放入一个组就得到了结果(这个为什么可能需要你想一下),如果存在的话,就要把剩余的数的和以及选出来的数放在一起进行搜索,得出最终结果。如果真的要考虑这种情况,我们再探讨吧。