Задача NP полная, можно не париться с поиском эффективного и точного алгоритма. Точный алгоритм сведется к почти полному перебору динамическим программированием оптимизированному ветвями и границами, будет занимать в итоге строк 50 и давать точный результат за 2-3 часа счета. Эффективный алгоритм будет жадным раскладывающим в порядке убывания величины, работающим за приемлемое время и дающим результат уступающий точному ~20%. Жадный алгоритм потребует больше сил на оптимизацию эвристик, чем точный. Вся геометрия, (проверка на пересечение) и отрисовка есть например в PaperJS. Когда вокруг такие санкции, я бы такое и за USD500 сделал.