Если есть сильное ограничение на вес любого из n камней, то эта задача решается методом динамического программирования.
Сначала нужно найти все возможные веса, которые только могут получиться, если брать любые комбинации камней. Потом выбираем из всех возможностей нужный вес.
Пусть
- массив, в котором 1 на месте i означает, что можно получить сумму весов, равную i, и 0 в противном случае. Сначала
, а все остальные элементы равны 0. Пусть вес i-го камня равен
.
Пусть
Код:
Цикл по i для каждого камня
Цикл по j по всем ячейкам A от (N-w[i]) до 0 ( в обратном порядке! )
если А[j] = 1 то A[j+w[i]] := 1
После этого мы знаем, какие веса могут появиться, а какие - не могут.
Теперь, если мы решили, что в одной кучке будет вес i, то в другой будет N-i, значит нам нужно найти такое i, чтобы разница
была минимальной. Значит надо найти такое
, для которого
и величина
минимальна.
Недостаток: нужно создавать массив, размера N. Зато если N окажется не очень большим, то метод работает существенно быстрее полного перебора. Как потом понять, какие камни в каких кучках будут, тут уже не трудно самому придумать.