Suppose we have a table of numbers like this (we can assume it is a square table):
20 2 1 3 4
5 1 14 8 9
15 12 17 17 11
16 1 1 15 18
For starters, you can use dynamic programming.
In your straightforward approach, you are doing exactly the same computation many, many times.
For example, at some point you answer the question: "For the last three columns with rows 1 and 2 already taken, how do I maximize the sum?" You compute the answer to this question twice, once when you pick row 1 from column 1 and row 2 from column 2, and once when you pick them vice-versa.
So don't do that. Cache the answer -- and also cache all similar answers to all similar questions -- and re-use them.
I do not have time right now to analyze the running time of this approach. I think it is O(2^n) or thereabouts. More later maybe...
This is the maximum cost bipartite matching problem. The classical way to solve it is by using the Hungarian algorithm.
Basically you have a bipartite graph: the left set is the rows and the right set is the columns. Each edge from row i
to column j
has cost matrix[i, j]
. Find the matching that maximizes the costs.