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