Хорошо, у меня есть эта задача: пол ванной комнаты у Джона был сломан. У нас есть карта этого этажа, где «.» хорошая пластинка, и «+» плохая пластина, например:Фиксирующий алгоритм пола
.+++
.+.+
Здесь мы имеем 5 разбитых тарелок и 3 хорошие. Есть два вида тарелок, которые продаются в магазине: пластины 1x1 и 2x1 пластины. Плата 1x1 стоит A, а плата 2x1 стоит B. Задача: приведенная карта пола, минимальная цена крепления пола.
Посмотрите на пример сверху: мы можем разместить 2 пластины 2x1 и 1 пластину 1x1. Таким образом, цена будет A + 2 * B.
У меня есть идея: для каждой разбитой пластины подсчитывается максимальная длина подключенных сломанных пластин. Тогда цена длина/2 * B + длина% 2 * A.
Проблема в том, что я действительно не знаю, как это сделать. У меня есть идея некоторых рекурсивного алгоритма, но есть так много проблем, как круги:
+++
+.+
+++
Поэтому у меня есть два вопроса:
- я иду в правильном направлении?
- Можете ли вы дать мне какие-либо намеки на реализацию этого алгоритма?
Спасибо!
EDIT
Существует тривиальный случай, когда 2 * A < B, но давайте говорить о нетривиальной =)
/EDIT
Возможно, алгоритм ранца был бы вдохновляющим? Http: //en.wikipedia.org/wiki/Knapsack_problem – csl
Вы можете начать с наблюдения за тем, что если '2 * A <= B', вам понадобится только 1x1 плитка. В каждом другом случае вы хотите увеличить количество 2x1 плиток. Итак, реальный вопрос: каков максимум 2x1 плиток, которые вы можете поместить в разбитые пространства? – biziclop
И вот подсказка, которая может помочь: http://en.wikipedia.org/wiki/Mutilated_chessboard_problem – biziclop