Стержень нужно разрезать на стержни. Найти оптимальный вариант раскроя - 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
выполняется чтение любого ключа, чтобы программа не закрылась сразу после вывода результатов.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д