Предположим, у нас есть таблица чисел, подобная этой (мы можем предположить, что это квадратная таблица):
20 2 1 3 4
5 1 14 8 9
15 12 17 17 11
16 1 1 15 18
20 13 15 5 11
Ваша задача - вычислить максимальную сумму из n чисел, где n - количество строкили столбцы в таблице.Выгода составляет , каждое число должно исходить из уникальной строки и столбца.
Например, выбирая числа в (0,0), (1,1), (2,2), (3,3) и (4,4) приемлемо, но (0,0), (0,1), (2,2), (3,3) и (4,4) не потому, чтопервые два числа были взяты из одной строки.
Мое (смехотворное) решение этой проблемы - перебрать все возможные перестановки строк и столбцов.Это работает для небольших сеток, но, конечно, это невероятно медленно, так как n становится большим.Он имеет O (n!) Временную сложность, если я не ошибаюсь (пример кода Python ниже).
Я действительно думаю, что это можно решить в более подходящее время, но я не придумаю достаточно ничегоумный.
Итак, мой вопрос: какой алгоритм следует использовать для решения этой проблемы?
Если это поможет, эта проблема кажется похожей на проблему рюкзак .
import itertools
import re
grid = """20 2 1 3 4
5 1 14 8 9
15 12 17 17 11
16 1 1 15 18
20 13 15 5 11"""
grid = [[int(x) for x in re.split("\s+", line)] for line in grid.split("\n")]
possible_column_indexes = itertools.permutations(range(len(grid)))
max_sum = 0
max_positions = []
for column_indexes in possible_column_indexes:
current_sum = 0
current_positions = []
for row, col in enumerate(column_indexes):
current_sum += grid[row][col]
current_positions.append("(%d, %d)" % (row, col))
if current_sum > max_sum:
max_sum = current_sum
max_positions = current_positions
print "Max sum is", max_sum
for position in max_positions:
print position