210,50,200,100 (может быть любая сумма или любое число), и мне нужно разделить его на N частей, чтобы суммы были примерно равны в основном с наименьшей разницей без сортировки или перестановки чисел,
Пример, 210,50,200,300 N = 3; оно должно делиться на 210 250 300 (разница между наименьшим и наибольшим значением равна 90)
Я попробовал программу, которая принимает в среднем 760/3 ~= 253, и пытается сложить число, поэтому требуется 210, и кажется, что добавление 50 приблизит или отдалит его от среднего, поэтому он добавляет 50, прополаскивает и повторяет, чтобы получить 260 200 300 это почти хорошо, но разница между 200 и 300 равна = 100, поэтому это не оптимально, так как при расчете без программы вы можете получить лучший результат. 210 и 300 имеют разницу только 90.
TL:DR
Нужен метод, который разбивает массив int примерно на равные части, не обязательно должен быть одинаковым, как можно ближе друг к другу без изменения позиций или массив.
Если вы не хотите давать мне метод, просто дайте мне псевдокод или основную идею, поскольку я сидел над этим несколько часов.
Код: Выделить всё
static int[] Skaiciuoti(int[] knygos, int d)
{
int[] skyriai = new int[d];
int n = knygos.Length;
double sum = knygos.Sum() / d;
Console.WriteLine(sum);
int kp = 0;
for (int i = 0; i < d; i++)
{
for (int j = kp; j < n; j++)
{
if (i == skyriai.Length - 1)
{
skyriai[i] = skyriai[i] + knygos[j];
kp++;
}
else if ((skyriai[i] + knygos[j]) < sum || skyriai[i] == 0)
{
skyriai[i] = skyriai[i] + knygos[j];
kp++;
}
else
{
break;
}
}
}
return skyriai;
}
Подробнее здесь: https://stackoverflow.com/questions/620 ... earranging
Мобильная версия