如果你想要一个足够好的解决方案,你可以使用贪婪的解决方案:
def minmax(lst, k):
lst = sorted(lst, reverse=True) # biggest numbers first is usually better
subs = [[] for _ in xrange(k)] # create the lists for the subarrays
while lst:
subs[0].append(lst.pop(0)) # append to the one with lowest sum
subs.sort(key=sum) # sort by sum (lowest first)
print subs # print the subarrays while creating them
return sum(subs[-1]) # we have sorted by sums, last has the biggest sum
这并不能保证产生最佳结果,但效果很好。
k = 2
这是你的例子:
print 'result is %d' % minmax([5, 10, 21, 20], 2)
输出
[[], [21]]
[[20], [21]]
[[21], [20, 10]]
[[21, 5], [20, 10]]
result is 30
嗯,它找到了比你展示的更好的解决方案。
k >= 4
让我们试试k=4 和k=5
>>> print 'result is %d' % minmax([5, 10, 21, 20], 4)
[[], [], [], [21]]
[[], [], [20], [21]]
[[], [10], [20], [21]]
[[5], [10], [20], [21]]
result is 21
>>> print 'result is %d' % minmax([5, 10, 21, 20], 5)
[[], [], [], [], [21]]
[[], [], [], [20], [21]]
[[], [], [10], [20], [21]]
[[], [5], [10], [20], [21]]
result is 21
你也可以在函数开头加上这段代码,当k >= len(lst)时直接返回lst的最大值:
def minmax(lst, k):
if k >= len(lst):
return max(lst)
....
最小制造跨度问题
这类问题以Minimum Makespan Problem的名字而闻名,搜索它你会检索到很多关于保证产生最佳结果的算法的信息,但它们的解释太远了堆栈溢出答案很复杂,而贪婪的答案很有趣且有启发性。