所以,我们的目标是获得尽可能接近0越好。
我首先想到的是,我会按降序排序的数组,然后在列表上迭代做这样的事情:
int total = 0;
foreach(int i in a)
{
total = Math.Min(Math.Abs(total - i), Math.Abs(total + i));
}
这将工作a={1,5,2,-2}
(总量将是以下5,4,2,0
)
但我不确定它是否适用于所有情况。我会仔细研究一下,看看是否有不适合的情况。
编辑:
好吧,我猜蛮力将工作?
public static int MinArray(int[] array)
{
int val = int.MaxValue;
for (int i = 0; i < Math.Pow(2, array.Length); i++)
{
val = Math.Min(CalcMin(array, i), val);
}
return val;
}
private static int CalcMin(int[] array, int negs)
{
int ret = 0;
for (int i = 0; i < array.Length; i++)
{
int neg = 1;
if (negs != 0)
{
neg = negs % 2 == 1 ? -1 : 1;
negs >>= 1;
}
ret += array[i] * neg;
}
return Math.Abs(ret);
}
所以,我在做什么走S的每个迭代(这是由我走在MinArray
二进制计算),并找到最小的方式。
通过修改基因的一点点,你也可以得到对S中的正确的值(如果这是必需的。如果不是,使其成为一个要求可能得分,你在采访中一些点?)
你能解释更详细的是什么VAL(X,Y)?如果我理解正确的话,VAL(X,Y)试图找到X和取得的线性组合的ÿ 1和-1的最接近的值为0 ... – 2011-04-19 14:25:48
我编辑了这个问题,我认为它现在应该更清楚 – yahh 2011-04-19 14:27:52
该函数可以返回负值吗?因为如果S = {{-1,-1,-1,1}},返回值将是小于'0'的-10。......啊,但是ABS,没关系,编辑清除 – 2011-04-19 14:30:09