Стержень нужно разрезать на стержни. Найти оптимальный вариант раскроя - QBasic
Формулировка задачи:
Вот условие задачки: Стержень длиной l0 нужно разрезать на стержни длиной l1,l2...lk. Количество отрезков каждого типа не ограничено. Найти оптимальный вариант раскроя, минимизирующий немерный остаток.
Буду рада любой помощи.
Решение задачи: «Стержень нужно разрезать на стержни. Найти оптимальный вариант раскроя»
textual
Листинг программы
- class Program
- {
- static void Main(string[] args)
- {
- Int32 l = 0, k = 0;
- Console.WriteLine("Введите длину стрержня: ");
- l = Int32.Parse(Console.ReadLine());
- Console.WriteLine("Введите кол-во отрезков: ");
- k = Int32.Parse(Console.ReadLine());
- Int32[] mas = new Int32 [k];
- Int32[] ind = new Int32[k];
- for (Int32 i = 0; i < k; i++)
- {
- ind[i] = 0;
- }
- for (Int32 i = 0; i < k;i++ )
- {
- Console.WriteLine("Введите {0}-й отрезок: ",i);
- mas[i] = Int32.Parse(Console.ReadLine());
- }
- Int32 j = 0;
- funk(j, l, k, ind, mas);
- Console.ReadKey();
- }
- static void funk(Int32 j, Int32 l, Int32 k, Int32[] ind, Int32[] mas)
- {
- for (ind[j] = 1; ind[j] < l; ind[j]++ )
- {
- if (j < k-1) funk(j+1,l,k,ind, mas);
- else
- {
- for (ind[j] = 1; ind[j] < l; ind[j]++)
- {
- Int32 tmp = 0;
- for (Int32 i = 0; i < k; i++)
- {
- tmp += ind[i] * mas[i];
- }
- if ((l - tmp) >= 0)
- {
- for (Int32 i = 0; i < k; i++)
- {
- Console.Write("{0}:{1} ", i, ind[i]);
- }
- Console.WriteLine("Остаток: {0}", l - tmp);
- }
- }
- j -= 1;
- }
- }
- j-=1;
- }
- }
Объяснение кода листинга программы
- Переменная
l
инициализируется значением, введенным пользователем, и представляет собой длину стержня. - Переменная
k
инициализируется значением, введенным пользователем, и представляет собой количество отрезков стержня. - Создаются два массива:
mas
иind
. Массивmas
будет хранить введенные пользователем значения длины каждого отрезка стержня, а массивind
будет использоваться для хранения индексов отрезков стержня. - В цикле пользователь вводит значения длины каждого отрезка стержня и сохраняет их в массиве
mas
. - В методе
funk
происходит процесс разрезания стержня на отрезки. Вводится индекс начального отрезка и инициализируется значение переменнойj
равным 0. - В цикле
for
происходит рекурсивный вызов методаfunk
для каждого следующего отрезка стержня. Если индекс текущего отрезка равенk-1
, то выполняется вычисление общей длины стержня, разрезанного на текущий и предыдущий отрезки. - Если текущий отрезок является последним, то выполняется проверка, можно ли разрезать оставшуюся часть стержня на
k-1
отрезков. Если да, то выводится сообщение с длиной каждого отрезка и остатком длины стержня. - Если текущий отрезок не является последним, то выполняется рекурсивный вызов метода
funk
для следующего отрезка. - После выхода из цикла
for
значение переменнойj
уменьшается на 1. - В методе
Main
после ввода длины стержня и количества отрезков пользователю вызывается методfunk
с начальным индексом равным 0. - После выхода из метода
funk
выполняется чтение любого ключа, чтобы программа не закрылась сразу после вывода результатов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д