Стержень нужно разрезать на стержни. Найти оптимальный вариант раскроя - 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;
        }
    }

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

  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