【发布时间】:2010-10-27 18:31:20
【问题描述】:
有一个数字列表。
该列表将被分成 2 个大小相等的列表,总和的差异最小。总和必须打印出来。#Example: >>>que = [2,3,10,5,8,9,7,3,5,2] >>>make_teams(que) 27 27
以下代码算法在某些情况下是否有错误?
如何优化和/或 Python 化它?
def make_teams(que):
que.sort()
if len(que)%2: que.insert(0,0)
t1,t2 = [],[]
while que:
val = (que.pop(), que.pop())
if sum(t1)>sum(t2):
t2.append(val[0])
t1.append(val[1])
else:
t1.append(val[0])
t2.append(val[1])
print min(sum(t1),sum(t2)), max(sum(t1),sum(t2)), "\n"
【问题讨论】:
-
这是装箱问题的变种吗?这是一个 NP 完全问题,IIRC。
-
que = [1,50,50,100] 应该给你 100 和 101 的团队。我认为你的算法会产生 51 和 150。
-
@S.Lott 这是一个编程竞赛中的练习题。这里是参考:codechef.com/problems/TEAMSEL我最好的理解说,没错。但系统将其标记为错误。
-
@Alex B:当我运行它时,我得到了 100 和 101。
-
@Alex B:我得到 100 和 101 是对的,供您参考。
标签: python algorithm dynamic-programming np-complete knapsack-problem