Разбить массив на n частей, чтобы длина массива макс. длины была минимальной) - VB

Узнай цену своей работы

Формулировка задачи:

Всем здравствуйте, подскажите, как решить задачу:
есть массив L размерности n, массив заполнен элементами длины L-i
Надо разделить массив на P частей ( p - фиксированное, задаётся ручками) так, чтобы минимизировать длину массива максимальной длины. Сортировать массив нельзя.
Пример: массив размерности 5, элементы - 1,2,3,7,5.
P = 3. Тогда результат такой : 1,2,3 - 7 - 5
Если поможет, то P не может быть более 10.
Подскажите, какие идеи..
Заранее спасибо.

Решение задачи: «Разбить массив на n частей, чтобы длина массива макс. длины была минимальной)»

textual
Листинг программы
<font color="blue">Option</font> <font color="blue">Explicit</font>

<font color="blue">Private</font> <font color="blue">Const</font> ArrSize <font color="blue">As</font> <font color="blue">Integer</font> = <font color="darkblue"><b>15</b></font>    <font color="#00AA00">'размер массива</font>
<font color="blue">Private</font> <font color="blue">Const</font> NumParts <font color="blue">As</font> <font color="blue">Integer</font> = <font color="darkblue"><b>6</b></font>    <font color="#00AA00">'количество частей</font>
<font color="blue">Private</font> <font color="blue">Const</font> MinValue <font color="blue">As</font> <font color="blue">Integer</font> = <font color="darkblue"><b>0</b></font>    <font color="#00AA00">'минимальное значение элемента (>=0)</font>
<font color="blue">Private</font> <font color="blue">Const</font> MaxValue <font color="blue">As</font> <font color="blue">Integer</font> = <font color="darkblue"><b>100</b></font>  <font color="#00AA00">'максимальное значение элемента</font>


<font color="blue">Private</font> <font color="blue">Sub</font> Command1_Click()

<font color="blue">Dim</font> Arr(<font color="darkblue"><b>1</b></font> <font color="blue">To</font> ArrSize) <font color="blue">As</font> <font color="blue">Integer</font>    <font color="#00AA00">'основной массив</font>
<font color="blue">Dim</font> Parts() <font color="blue">As</font> <font color="blue">Integer</font>              <font color="#00AA00">'карта разреза</font>
<font color="blue">Dim</font> BestParts() <font color="blue">As</font> <font color="blue">Integer</font>
<font color="blue">Dim</font> BestDiff <font color="blue">As</font> <font color="blue">Long</font>, PartSum <font color="blue">As</font> <font color="blue">Long</font>, MinPartSum <font color="blue">As</font> <font color="blue">Long</font>, MaxPartSum <font color="blue">As</font> <font color="blue">Long</font>, ArrSum <font color="blue">As</font> <font color="blue">Long</font>
<font color="blue">Dim</font> i <font color="blue">As</font> <font color="blue">Integer</font>, j <font color="blue">As</font> <font color="blue">Integer</font>, k <font color="blue">As</font> <font color="blue">Integer</font>
<font color="blue">ReDim</font> Parts(<font color="darkblue"><b>1</b></font> <font color="blue">To</font> NumParts)
<font color="blue">ReDim</font> BestParts(<font color="darkblue"><b>1</b></font> <font color="blue">To</font> NumParts)


<font color="#00AA00">'набиваем массив случайными данными</font>
<font color="blue">Randomize</font>
ArrSum = <font color="darkblue"><b>0</b></font>
<font color="blue">For</font> i = <font color="darkblue"><b>1</b></font> <font color="blue">To</font> ArrSize
  Arr(i) = Fix(Rnd(<font color="darkblue"><b>1</b></font>) * (MaxValue + <font color="darkblue"><b>1</b></font>) + MinValue)
  ArrSum = ArrSum + Arr(i)
<font color="blue">Next</font>
<font color="#00AA00">'инициализируем карту</font>
<font color="blue">For</font> i = <font color="darkblue"><b>2</b></font> <font color="blue">To</font> NumParts
  Parts(i) = <font color="darkblue"><b>1</b></font>
<font color="blue">Next</font>
Parts(<font color="darkblue"><b>1</b></font>) = ArrSize - NumParts + <font color="darkblue"><b>1</b></font>
BestParts = Parts
BestDiff = ArrSum

<font color="blue">Do</font>
  <font color="#00AA00">'ищем минимальную и максимальную сумму части</font>
  MinPartSum = ArrSum
  MaxPartSum = <font color="darkblue"><b>0</b></font>
  j = <font color="darkblue"><b>1</b></font>
  <font color="blue">For</font> i = <font color="darkblue"><b>1</b></font> <font color="blue">To</font> NumParts
    PartSum = <font color="darkblue"><b>0</b></font>
    <font color="blue">For</font> j = j <font color="blue">To</font> j + Parts(i) - <font color="darkblue"><b>1</b></font>
      PartSum = PartSum + Arr(j)
    <font color="blue">Next</font>
    <font color="blue">If</font> MinPartSum > PartSum <font color="blue">Then</font> MinPartSum = PartSum
    <font color="blue">If</font> MaxPartSum < PartSum <font color="blue">Then</font> MaxPartSum = PartSum
  <font color="blue">Next</font>
  <font color="#00AA00">'запоминаем лучшую разницу между минимумом и максимумом</font>
  <font color="blue">If</font> BestDiff > MaxPartSum - MinPartSum <font color="blue">Then</font>
    BestDiff = MaxPartSum - MinPartSum
    BestParts = Parts
  <font color="blue">End</font> <font color="blue">If</font>
<font color="blue">Loop</font> <font color="blue">While</font> NextParts(Parts)

<font color="#00AA00">'печать результата</font>
Debug.<font color="blue">Print</font> <font color="teal">"Массив:"</font>
<font color="blue">For</font> i = <font color="darkblue"><b>1</b></font> <font color="blue">To</font> ArrSize
  Debug.<font color="blue">Print</font> CStr(Arr(i)) + <font color="teal">" "</font>;
<font color="blue">Next</font>
Debug.<font color="blue">Print</font> <font color="teal">""</font>
Debug.<font color="blue">Print</font> <font color="teal">"Разбивка:"</font>
j = <font color="darkblue"><b>1</b></font>
<font color="blue">For</font> i = <font color="darkblue"><b>1</b></font> <font color="blue">To</font> NumParts
  <font color="blue">For</font> j = j <font color="blue">To</font> j + BestParts(i) - <font color="darkblue"><b>1</b></font>
    Debug.<font color="blue">Print</font> CStr(Arr(j)) + <font color="teal">" "</font>;
  <font color="blue">Next</font>
  Debug.<font color="blue">Print</font> <font color="teal">""</font>
<font color="blue">Next</font>

<font color="blue">End</font> <font color="blue">Sub</font>

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.778 из 5
Похожие ответы