让我说我有这个:
1A=6 2A=4.5 3A=6
1B=7 2B=6 3B=7.5
1C=6 2C=6.75 3C=9
我想找到产生最高总和的数字组合。字母前面的数字都不能多次使用,数字后面的字母都不能多次使用。例如。 1A+2B+3C, 1C+2B+3A
有效。 1A+1B+2B,3A+2B+3B,1A+2A+3A
无效。
在这种情况下,最高金额为1A+2B+3C=21
。如何使用python找到这个结果和组合?
提前致谢
答案 0 :(得分:3)
对于具有相同数字前缀的每个条目,找到它们中的最大值。然后总结所有这些最大值,你将获得给定限制的最大总和。
如果数字和字母必须是唯一的,那么它就成了一个可以用Hungarian algorithm解决的问题。
匈牙利方法是一种组合优化算法,可以在多项式时间
中求解assignment problem[...]
来自assignment problem的描述:
分配问题是数学优化或运算研究分支中的基本组合优化问题之一。它包括在加权二分图中找到最大权重matching。
最常见的形式,问题如下:
有许多代理和许多任务。可以分配任何代理来执行任何任务,从而产生一些可能因代理 - 任务分配而异的成本。需要通过为每个任务准确分配一个代理并为每个代理分配一个任务来执行所有任务,从而最大限度地降低分配的总成本。
答案 1 :(得分:2)
我不是python的人,所以下面的代码可能看起来不像“python风格”,但算法应该没问题。
#test input. the matrix can be any n * n size.
matrix = [[6,7,6],[4.5,6,6.75],[6,7.5,9]]
#assistant array to track which numbers we have already used.
#check[i] = 1 if i has been used
check = [0]* len(matrix)
#max sum
max_sum = 0
def getMax(matrix,check,row,curr_sum):
global max_sum
#base case, we have reached the last letter.
#check to see if this combination is max
if(row==len(matrix)-1):
for i in range(len(check)):
if(check[i]==0 and (matrix[row][i]+curr_sum)>max_sum):
max_sum = matrix[row][i]+curr_sum
#recursive case, pick the current available number, go to next letter.
else:
for i in range(len(check)):
if(check[i]==0):
check[i]=1
getMax(matrix,check,row+1,curr_sum+matrix[row][i])
check[i]=0
getMax(matrix,check,0,0)
print max_sum
请注意,这是一种使用递归的强力算法。就时间复杂性而言,存在更好的算法(例如,动态编程方法)。您可以向方法添加缓存以提高效率。
此外,如果您想了解组合,我们需要额外的努力来跟踪组合。 (例如,使用另一个矩阵记录)
答案 2 :(得分:1)
这可以通过以下方式完成:
l1 = [6, 7, 6]
l2 = [4.5, 6, 6.75]
l3 = [6, 7.5, 9]
map(max, [l1, l2, l3])
答案 3 :(得分:0)
实际上,python有一些库可以帮你做到这一点。见这里:Munkres