随机数组,分成两个数组,要求两个数组各自加总的差值最小
例如这个随机 ROUNDNUM[]{ 17;13;11;10;9;9}
分成两组数组A + B,要求两组数据的各自的总和相差最小(Sum(A数组) - Sum(B数组)差值最小)
A 数组 和 B数组的长度可以不相等
思路是什么啊? 求解惑....
------解决方案--------------------要“最小”,只能遍历所有可能,并且取最小的。稍微改进的算法是用动态规划。
如果是“尽可能小”,也就是找近似最优解,那么算法就很多了,很多启发式算法都可以做,比如模拟退火,遗传算法,蚁群算法、神经元网络。
------解决方案--------------------呵呵,忽然觉得循环那里写得好蠢.另外补上注释.
int[] ROUNDNUM = new int[6] { 17, 13, 11, 10, 9, 9 };//随机数
Array.Sort(ROUNDNUM);//排序(由小到大)
int sumA=0;//数组A的和
int sumB=0;//数组B的和
int n = ROUNDNUM.Length;//随机数数组长度
int[] arrayA = new int[n];//A组数组(按照最长的可能长度初始化)
int[] arrayB = new int[n];//B组数组(按照最长的可能长度初始化)
int arrayAN = 0;//记录A组的下标
int arrayBN = 0;//记录B组的下标
for (int i = n-1; i >=0; i--)//倒序循环,从大向小决策
{
int v = ROUNDNUM[i];//当前值
if (Math.Abs(sumA + v - sumB) > Math.Abs(sumB + v - sumA))//分组决策
{
sumB = sumB + v;//加入B组累计值
arrayB[arrayBN] = v;//向B组添加数据
arrayBN++;//更新B组下标
}
else
{
sumA = sumA + v;//加入A组累计值
arrayA[arrayAN] = v;//向A组添加数据
arrayAN++;//更新A组下标
}
}
Array.Resize(ref arrayA, arrayAN);//根据下标去掉没有用到的元素
Array.Resize(ref arrayB, arrayBN);
MessageBox.Show((sumA - sumB).ToString());
------解决方案--------------------