Стержень нужно разрезать на стержни. Найти оптимальный вариант раскроя - QBasic

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

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

Вот условие задачки: Стержень длиной l0 нужно разрезать на стержни длиной l1,l2...lk. Количество отрезков каждого типа не ограничено. Найти оптимальный вариант раскроя, минимизирующий немерный остаток. Буду рада любой помощи.

Решение задачи: «Стержень нужно разрезать на стержни. Найти оптимальный вариант раскроя»

textual
Листинг программы
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             Int32 l = 0, k = 0;
  6.             Console.WriteLine("Введите длину стрержня: ");
  7.             l = Int32.Parse(Console.ReadLine());
  8.             Console.WriteLine("Введите кол-во отрезков: ");
  9.             k = Int32.Parse(Console.ReadLine());
  10.             Int32[] mas = new Int32 [k];
  11.             Int32[] ind = new Int32[k];
  12.             for (Int32 i = 0; i < k; i++)
  13.             {
  14.                 ind[i] = 0;
  15.             }
  16.             for (Int32 i = 0; i < k;i++ )
  17.             {
  18.                 Console.WriteLine("Введите {0}-й отрезок: ",i);
  19.                 mas[i] = Int32.Parse(Console.ReadLine());
  20.             }
  21.             Int32 j = 0;
  22.             funk(j, l, k, ind, mas);
  23.             Console.ReadKey();
  24.         }
  25.         static void funk(Int32 j, Int32 l, Int32 k, Int32[] ind, Int32[] mas)
  26.         {
  27.             for (ind[j] = 1; ind[j] < l; ind[j]++ )
  28.             {
  29.                 if (j < k-1) funk(j+1,l,k,ind, mas);
  30.                 else
  31.                 {
  32.                     for (ind[j] = 1; ind[j] < l; ind[j]++)
  33.                     {
  34.                         Int32 tmp = 0;
  35.                         for (Int32 i = 0; i < k; i++)
  36.                         {
  37.                             tmp += ind[i] * mas[i];
  38.                         }
  39.                         if ((l - tmp) >= 0)
  40.                         {
  41.                             for (Int32 i = 0; i < k; i++)
  42.                             {
  43.                                 Console.Write("{0}:{1} ", i, ind[i]);
  44.                             }
  45.                             Console.WriteLine("Остаток: {0}", l - tmp);
  46.                         }
  47.                     }
  48.                     j -= 1;
  49.                 }                
  50.             }
  51.             j-=1;
  52.         }
  53.     }

Объяснение кода листинга программы

  1. Переменная l инициализируется значением, введенным пользователем, и представляет собой длину стержня.
  2. Переменная k инициализируется значением, введенным пользователем, и представляет собой количество отрезков стержня.
  3. Создаются два массива: mas и ind. Массив mas будет хранить введенные пользователем значения длины каждого отрезка стержня, а массив ind будет использоваться для хранения индексов отрезков стержня.
  4. В цикле пользователь вводит значения длины каждого отрезка стержня и сохраняет их в массиве mas.
  5. В методе funk происходит процесс разрезания стержня на отрезки. Вводится индекс начального отрезка и инициализируется значение переменной j равным 0.
  6. В цикле for происходит рекурсивный вызов метода funk для каждого следующего отрезка стержня. Если индекс текущего отрезка равен k-1, то выполняется вычисление общей длины стержня, разрезанного на текущий и предыдущий отрезки.
  7. Если текущий отрезок является последним, то выполняется проверка, можно ли разрезать оставшуюся часть стержня на k-1 отрезков. Если да, то выводится сообщение с длиной каждого отрезка и остатком длины стержня.
  8. Если текущий отрезок не является последним, то выполняется рекурсивный вызов метода funk для следующего отрезка.
  9. После выхода из цикла for значение переменной j уменьшается на 1.
  10. В методе Main после ввода длины стержня и количества отрезков пользователю вызывается метод funk с начальным индексом равным 0.
  11. После выхода из метода funk выполняется чтение любого ключа, чтобы программа не закрылась сразу после вывода результатов.

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


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

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

11   голосов , оценка 4.273 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут