我正在寻找能否抓住如何编码问题的方法,最好是在Python语言中。我想做的是来自5个单独的列表,每个列表中有5个值,找到最小值的总和,其中每个列/行只能使用一次或两次的值。
例如,在以下示例中:
! p ! q ! r ! s ! t !
A !$98 !$96 !$93 !$88 !$86!
B !$76 !$75 !$70 !$68 !$64!
C !$64 !$64 !$66 !$60 !$59!
D !$56 !$55 !$62 !$58 !$57!
E !$50 !$56 !$53 !$48 !$49!
期望的结果是找到最小的总值,其中只有一个p,q,r,s或t可以分配给A,B,C,D或E.即,在p列中不能有2个值两次。 例如,最简单的可能性是:98 + 75 + 66 + 58 + 49 = ...但它必须是可能的最低总值。
我不确定这是用列表或数组做的,还是用它做什么。我非常感谢您提供的任何帮助。
答案 0 :(得分:1)
from itertools import permutations
data = [
[98, 96, 93, 88, 86],
[76, 75, 70, 68, 64],
[64, 64, 66, 60, 59],
[56, 55, 62, 58, 57],
[50, 56, 53, 48, 49]
]
def item_sum(cols):
return sum(row[col] for row,col in zip(data,cols))
best_cols = min(permutations(range(5)), key=item_sum)
total = item_sum(best_cols)
给出了
best_cols => (4, 3, 2, 1, 0) => [86, 68, 66, 55, 50]
total => 321
答案 1 :(得分:0)
这是一个提示。
给出列表清单:
>>> LoL=[[1,2,3],[4,5,6],[7,8,9]]
您可以使用列表解析来获取各个子列表的总和:
>>> [sum(li) for li in LoL]
[6, 15, 24]
然后,您可以使用min
获得最低要求:
>>> min(sum(li) for li in LoL)
6
您可以通过这种方式获取列表索引:
>>> min([(i,sum(li)) for i, li in enumerate(LoL)], key=lambda t: t[1])
(0, 6)
这是解决问题所需要的90%。