В общем, оно на вход принимает coverage-матрицу — probabilities, где probabilities[i][j] — это «вероятность» того, что
Вот более оптимальная и понятная реализация на питоне:
github.com/...aster/coverage_problem.py
Интересно было бы взглянуть на реализацию этой штуки на плюсах «в пять строк»)
Cуть проблемы: есть n множеств (некоторые возможно пересекаются), из этих n множеств надо выбрать только k, таким образом, что бы количество разных элементов в их объединении было максимальным. Тривиальный пример, A = {0, 1}, B = {1, 3}, C = {1, 2, 3}; k = 2; Решение — A, C, так как AUС = {0, 1, 2, 3}, любое другое объединения двух множеств из A,B,C вложено в AUС. Или еще пример A = {1, 2, 3}, B = {2, 4}, C = {5, 6}; k = 2; Решение A, C, так как количество разных элементов в AUC больше чем в AUB и BUC. Далее в статье приводится формальное определение задачи в терминах целочисленного линейного программирования. Далее приводится жадный алгоритм (собственно реализация похожей штуки — в шапке темы), суть — итеративно на каждом шаге выбирается такое множество, которое содержит максимальное количество элементов, которых нету в ранее выбранных множествах. Далее приводятся постановки более общих формулировок проблемы.