Вам надо придумать еще парочку, для каждого варианта найти формулу, сколько шаблонов влезет по горизонтали и вертикали в зависимости от размеров листа (W, H) и трех размеров коробки (a, b, c)
Шаблон со сдвигом по диаганали, наверно, не самый эффективный, но это вам на подумать пример.
Например, для верхнего левого варианта влезает x=floor(W/(2a+2b) по горизонтали и y=floor((H-b)/(b+c)). Значит, всего в лист влезет x*y раскроев.
Еще возможны шаблоны, где используется не один вид развертки коробки, а несколько. Потом, еще могут быть всякие хитрые развертки, когда размеры коробки частично совпадают (например, 2 числа одинаковые, а третье больше или меньше). В этом случае могут быть возможны еще варианты расположений коробок. Еще отдельный случай - кубы. Когда у коробок все размеры одинаковые, ими можно замостить плоскость.
Потом вам надо в программе перебрать 6 перестановок всех длин коробки, 2 перестановки размеров листа, подставить во все формулы для разных паттернов и выбрать максимум.
Если коробок влезает мало, то возможно сделать полный перебор, который пытается впихнуть одну из возможных разверток на лист, касаясь уже поставленных там разверток и краев коробки (перебираете все возможные точки касания потом смотрите чтобы нигде ни с чем ничто не пересекалось). Но это может сможет расположить три вместо двух разверток. Если их хотя бы десяток влезает простым шаблоном, то полный перебор будет работать вечность и максимум впихнут 2-3 лишние коробки.
Lynn «Кофеман», Это уже сверху навешивается, когда имея набор шаблонов и их цены, надо выбрать, что же вырезать, чтобы побольше прибыли получить. Тут же более геометрическая задача - распихать в прямоугольнике как можно болше разверток одинаковых коробок.
ashot_powershot, C++ не умеет выводить массивы. Вам придется выводить по одному числу. Можно не выводить текст и вместо перевода строки выводить пробел. Тогда массив будет напечатан на одной строке.
Игорь Чувилин, Нет, не надо с С начинать. Вам надо пройти ознакомительный курс ассемблера. Писать на нем настоящие программы, конечно, не надо. Но после каких-то простеньких упражнений вы поймете как компьютеры устроены, что за стек, куча, как память организована.
Игорь Чувилин, В принципе, да. Естественно, в момент объявления массива его длина должна быть известна. А дальше, выделение массива на стеке - всего лишь сдвиг регистра, указывающего на верхушку стека. Но там куча деталей, как адресовать остальные локальные переменные, как выкинуть из стека все локальные переменные включая массивы и т.д. Обычно, все локальные переменные выделяются в самом начале функции и их смещения во фрейме стека известны во время компиляции.
alexhuuu, Это называется VLA.
Это не стандарт C, а лишь расширение. Не все компиляторы это поддерживают и это может усложнить генерируемый код. Лучше так не делать.
Игорь Чувилин, Вообще в C++ случайное невозможное изменение какой-то переменной - это почти всегда проблема работы с памятью. Или выход за границы массива, или use-after-free.
Вот вы и опишите, чем лучше-то? Какие у вас критерии? Формализуйте - без этого ваша задача не имеет смысла.
чтобы поменьше чисел было в формуле
В формуле итак всего 2 числа: 56734234928564892357783 и 1. Меньше уже никак. Или вам надо, чтобы сами числа были поменьше? Ну тогда 56734234928564892357784 = 1+1+1+1+1+... и так до посинения. Да, их много - но зато сами числа такие маленькие, что меньше уже никак.
Возвращаемся к моему вопросу, что за фурмула вам нужна? Какие свойства у нее должны быть?
Даня , первый тест, наверняка - пример из задания. Вы свою программу на нем запускали-то хотя бы?
Что-то не так сделали, раз ошибки выдает. А при чем тут длина: подумайте, а что, если слово на конце строки. Перед каким же символом заканчивается это слово?
Вам надо придумать еще парочку, для каждого варианта найти формулу, сколько шаблонов влезет по горизонтали и вертикали в зависимости от размеров листа (W, H) и трех размеров коробки (a, b, c)
Шаблон со сдвигом по диаганали, наверно, не самый эффективный, но это вам на подумать пример.
Например, для верхнего левого варианта влезает x=floor(W/(2a+2b) по горизонтали и y=floor((H-b)/(b+c)). Значит, всего в лист влезет x*y раскроев.
Еще возможны шаблоны, где используется не один вид развертки коробки, а несколько. Потом, еще могут быть всякие хитрые развертки, когда размеры коробки частично совпадают (например, 2 числа одинаковые, а третье больше или меньше). В этом случае могут быть возможны еще варианты расположений коробок. Еще отдельный случай - кубы. Когда у коробок все размеры одинаковые, ими можно замостить плоскость.
Потом вам надо в программе перебрать 6 перестановок всех длин коробки, 2 перестановки размеров листа, подставить во все формулы для разных паттернов и выбрать максимум.
Если коробок влезает мало, то возможно сделать полный перебор, который пытается впихнуть одну из возможных разверток на лист, касаясь уже поставленных там разверток и краев коробки (перебираете все возможные точки касания потом смотрите чтобы нигде ни с чем ничто не пересекалось). Но это может сможет расположить три вместо двух разверток. Если их хотя бы десяток влезает простым шаблоном, то полный перебор будет работать вечность и максимум впихнут 2-3 лишние коробки.