62,017
社区成员
发帖
与我相关
我的任务
分享
static void Main()
{
int[] values = { 100, 200, 300, 400, 500, 600, 700, 600 };
//int[] values = { 1, 1, 1 , 1,2};
double x = 1, y = 3, z = 4;
int maxValue = 0;
int sumTotal = 0;
foreach (int val in values)
{
sumTotal += val;
if (val > maxValue) maxValue = val;
}
int len = values.Length;
double xyz = x + y + z;
x = (x * sumTotal) / xyz;
y = (y * sumTotal) / xyz;
z = (z * sumTotal) / xyz;
double offset = maxValue;
int[] x1 = new int[0], y1 = new int[0], z1 = new int[0];
for (int countX = 1; countX <= len - 2; countX++)
{
Combination(len, countX, delegate(int[] indexesX)
{
int sumX = Sum(values, indexesX);
double offsetX = Math.Abs(sumX - x);
if (offsetX <= maxValue)
{
int[] arrayYZ = CopyArrayByExclude(values, indexesX);
int lenYZ = arrayYZ.Length;
for (int countY = 1; countY <= lenYZ - 1; countY++)
{
Combination(lenYZ, countY, delegate(int[] indexesY)
{
int sum2 = Sum(values, indexesY);
double offsetY = Math.Abs(sum2 - y);
if (offsetY <= maxValue)
{
int[] arrayZ = CopyArrayByExclude(arrayYZ, indexesY);
int sumZ = Sum(arrayZ);
double offsetZ = Math.Abs(sumZ - z);
if ((offsetX + offsetY + offsetZ) / 2 <= offset)
{
offset = (offsetX + offsetY + offsetZ) / 2;
x1 = CopyArrayByInclude(values, indexesX);
y1 = CopyArrayByInclude(arrayYZ, indexesY);
z1 = arrayZ;
}
}
});
}
}
});
}
Console.WriteLine("运算结果");
Console.Write("Offset: " + offset);
Console.Write("\nX: ");
foreach (int i in x1) Console.Write(i + " ");
Console.Write("\nY: ");
foreach (int i in y1) Console.Write(i + " ");
Console.Write("\nZ: ");
foreach (int i in z1) Console.Write(i + " ");
Console.ReadKey();
}
static int Sum(int[] values)
{
int total = 0;
for (int i = 0; i < values.Length; i++)
{
total += values[i];
}
return total;
}
static int Sum(int[] values, int[] sumIndexs)
{
int total = 0;
for (int i = 0; i < sumIndexs.Length; i++)
{
total += values[sumIndexs[i]];
}
return total;
}
static int[] CopyArrayByExclude(int[] array, int[] excludeIndexes)
{
int[] newArray = new int[array.Length - excludeIndexes.Length];
int newArrayIndex = 0;
for (int i = 0; i < array.Length; i++)
{
bool pass = false;
foreach (int index in excludeIndexes)
{
if (i == index)
{
pass = true;
break;
}
}
if (!pass)
{
newArray[newArrayIndex] = array[i];
newArrayIndex++;
}
}
return newArray;
}
static int[] CopyArrayByInclude(int[] array, int[] includeIndexes)
{
int[] newArray = new int[includeIndexes.Length];
for (int i = 0; i < includeIndexes.Length; i++)
{
newArray[i] = array[includeIndexes[i]];
}
return newArray;
}
static void Combination(int len, int count, Action<int[]> process)
{
int[] indexes = new int[count];
int pos = 0;
while (true)
{
if (pos == count - 1)
{
process(indexes);
if (indexes[pos] < len - 1)
{
indexes[pos]++;
}
else
{
bool isEnd = true;
for (int i = count - 2; i >= 0; i--)
{
if (indexes[i] < len - count + i)
{
pos = i;
indexes[pos]++;
isEnd = false;
break;
}
}
if (isEnd) break;
}
}
else
{
indexes[pos + 1] = indexes[pos] + 1;
pos++;
}
}
}