Случайная мысль появилась у меня в голове (когда я делился шоколадной батонкой, конечно!). Мне было интересно, существует ли общий алгоритм для решения этой проблемы.
Проблема следующая:
Info
1. У вас есть шоколадная плита с небольшими квадратами, расположенная в прямоугольной матрице
2. В комнате есть n человек.
Проблема
Напишите алгоритм, который выводит оптимальную конфигурацию (p x q), где бар может делиться поровну между n, n-1, n-2...., 2, 1
людьми с учетом следующих ограничений:
1. Маленькие квадраты (единичный квадрат) нельзя разрезать на кусочки меньшего размера - 2. Все разрывы должны выполняться полностью вдоль одной оси - 3. Общее количество разрывов не может быть больше n (это препятствует неэффективным решениям, таким как попытка разбить весь стержень на мелкие кусочки и разделить мелкие кусочки)
4. p или q не могут быть равны 1. yx указал в одном из ответов, что проблема легко разрешима, если одна сторона имеет 1 бар. Это, однако, не является хорошим решением для ситуаций в реальном мире, что было целью решения этой проблемы.
Пример
Для n = 4 оптимальный конфигурация 4 x 3.
~~~~ ~~~~ ~~~~ ~~~~
| | | | |
~~~~ ~~~~ ~~~~ ~~~~
| | | | |
~~~~ ~~~~ ~~~~ ~~~~
| | | | |
~~~~ ~~~~ ~~~~ ~~~~
Эта конфигурация может быть разделена между:
4 человека в 3 перерывах по вертикальным осям
3 человека с 2 перерывами вдоль горизонтальных осей
2 человека с 1 разрывом вправо
Другие эмпирические решения (n, p, q) = (1, 1, 1); (2, 2, 1); (3, 3, 2); (4, 4, 3); (5, 5, 12); (6, 6, 10) OR (6, 5, 12)
Разъяснения
Разрыв определяется как разрез вдоль одной оси для подмножества бара, если это применимо. Чтобы лучше проиллюстрировать это, скажем, у вас есть 2 x 2 шоколада, как это:
~~~~ ~~~~
| | |
~~~~ ~~~~
| | |
~~~~ ~~~~
Обычная мудрость гласит, что вам нужно сделать 2 разрыва (перпендикулярные оси в середине - вниз и поперек), чтобы разделить этот стержень на 4 части. Тем не менее, в реальном мире (если бы это был шоколадный бар), вы сначала разделили бы его пополам, а затем разломили каждую половину снова, отдельно. Это составляет в общей сложности 3 разрыва - 1 разрыв на всем баре и 2 разрыва на 2 разных подмножества бара.
Я не мог найти решение в любом месте в Интернете - если кто-то считает, что это не связанный с программированием вопрос или решение уже существует, не стесняйтесь закрыть вопрос =)