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

时间:2013-03-22 04:41:44

标签: algorithm

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

list1:  4 5 7.
list2:  3 5 7.
list3:  1 5

如果我们从list1中选择7,我们在列表2中选择的最大数字是5(因为相同的数字不能被选择两次),如果我们从list2中选择5,我们只能从list3中选择1,所以总和是7+5+1=13

这不是最好的选择。但是,如果我们从list1中选择4,从list2中选择7,从list3中选择5,则总和为4+7+5=16

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

2 个答案:

答案 0 :(得分:4)

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

  

我们给出一个非负n×n矩阵,其中第i个元素   row和j-column表示分配第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

将以下算法http://en.wikipedia.org/wiki/Hungarian_algorithm#Setting应用于上述矩阵。

答案 1 :(得分: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次。