如果我们有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
是否有算法可以找到最佳的选择方法以获得最大的总和? 解决方案应该是完美的。
答案 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次。