Вот удар в это.Вы можете использовать динамическое программирование для решения проблемы суммы подмножеств, а затем для каждого возможного подмножества просто проверить, образует ли оно остовное дерево.Общая формулировка суммы подмножеств выглядит следующим образом: пусть C [i, S] будет логическим значением оператора
Существует подмножество S, которое суммирует с i
Пусть е - произвольное ребро.Тогда обычно повторяется:
C [i, S 'U e] = истинно, если C [i, S'] или C [i - вес (е), S ']
(либо вы используете ребро e, либо не используете его и убедитесь, что использование ребра e не образует цикл).
Если целевая стоимость равна c, вам необходимо выполнитьn развертки для каждого 1 <= i <= c, где n - количество ребер. </p>
Наконец, убедитесь, что количество выбранных ребер на 1 меньше количества вершин, и все они связаны.
Другой подход состоит в том, чтобы просто использовать обратную рекурсию для поиска по всем связующим деревьям <= targetCost. </p>