Algorithm 算法:从每个列表中选择一个数字,找到最大和

Algorithm 算法:从每个列表中选择一个数字,找到最大和,algorithm,Algorithm,如果我们有n个列表,我们需要从每个列表中选择一个数字,所选数字不能再次选择,如何进行选择以获得n个所选数字的最大和? e、 g 如果我们从列表1中选择7,那么列表2中可以选择的最大数字是5(因为同一个数字不能选择两次),如果我们从列表2中选择5,那么我们只能从列表3中选择1,因此总和是7+5+1=13 这不是最好的选择。但是,如果我们从列表1中选择4,从列表2中选择7,从列表3中选择5,则总和为4+7+5=16 是否有一种算法可以找到进行选择的最佳方法,以获得最大的总和? 解决方案应该是完美的

如果我们有n个列表,我们需要从每个列表中选择一个数字,所选数字不能再次选择,如何进行选择以获得n个所选数字的最大和? e、 g

如果我们从列表1中选择7,那么列表2中可以选择的最大数字是5(因为同一个数字不能选择两次),如果我们从列表2中选择5,那么我们只能从列表3中选择1,因此总和是
7+5+1=13

这不是最好的选择。但是,如果我们从列表1中选择4,从列表2中选择7,从列表3中选择5,则总和为
4+7+5=16

是否有一种算法可以找到进行选择的最佳方法,以获得最大的总和?
解决方案应该是完美的

没有直接算法,但是,通过修改匈牙利算法,可以在多项式时间内解决该问题

我们给出了一个非负的n×n矩阵,其中第i个矩阵中的元素 行和第j列表示将第j个作业分配给的成本 第i个工人。我们必须把工作分配给工人 成本最低的工人。如果目标是找到作业 这就产生了最大的成本,问题可以改变以适应 通过将每个成本替换为最大成本减去 成本

构造维度矩阵(K*K),其中K=max(n,列表中元素的最大数量)

例如:

List 1=1 2 3 4
List 2=5
List 3=9 10

The K*K matrix is:
1 2  3 4
5 0  0 0
9 10 0 0
0 0  0 0

将以下算法应用于上述矩阵。

因为我们已经对列表进行了排序,并且列表中的所有成员都是正数,所以列表中最大的一个应该在结果列表中。您还应该假设列表中的数字不会重复。否则就没有意义了

List1 : 2 2 2 
List2 : 2 2
我们不需要迭代列表中的所有数字。在最坏的情况下,我们会遇到我们以前见过的n-1个数字。比如:

list1: 5 6 7
list2: 5 6 7
list3: 5 6 7 
所以,我会这样做

for list in lists:
   max = list[len(list)] 
   possible_result.append(max)
   for j = len(list) to j = len(list)-n in other lists:
      max = list[j]
      if not max exist in possible_result:
          append to possible_result
Find largest possible_result   

第一次迭代将运行n次第二次迭代,在最坏的情况下,运行n-1次。

可能是Knuth的“舞动链接”算法?这可能是一个NP难问题,始终要以最佳方式解决。你的解决方案必须是完美的还是好的?我们可以假设每一行都已排序吗?你可以假设每一行都已排序。有比多项式时间更好的解决方案吗?我认为这个问题没有比匈牙利算法更好的算法。这似乎不是同一个问题。这有一个约束,即同一列不能使用两次,而OP限制使用同一值两次。
for list in lists:
   max = list[len(list)] 
   possible_result.append(max)
   for j = len(list) to j = len(list)-n in other lists:
      max = list[j]
      if not max exist in possible_result:
          append to possible_result
Find largest possible_result