Разбиение массива на примерно равные суммы без перестановкиC#

Место общения программистов C#
Ответить
Anonymous
 Разбиение массива на примерно равные суммы без перестановки

Сообщение Anonymous »

Итак, у меня есть это задание, которое поставило меня в тупик, я даю массив целых чисел, например
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»