问题:
您将获得整数权重列表。您需要将这些权重分配到两个集合中,以使每个集合的总权重之间的差异尽可能低
输入数据:权重列表
输出数据:表示可能的最低权重差异的数字。
我看到了答案,但我无法理解为什么bestval = -1。任何人都可以帮我搞清楚吗?非常感谢!
代码如下:
import itertools;
def checkio(stones):
total = 0
for cur in stones:
total += cur
bestval = -1
for i in range(0,len(stones)):
for comb in itertools.combinations(stones,i):
weight = 0
for item in comb:
weight += item
d = diff(total - weight, weight)
if bestval == -1 or d < bestval:
bestval = d
return bestval
def diff(a,b):
if a >= b:
return a - b
else:
return b - a
答案 0 :(得分:2)
这是知道不能正确的起始值,所以无论多么糟糕,它都会被第一个答案取代!
答案 1 :(得分:1)
bestval
最初设置为-1,并在循环第一次更新为d
。之后,bestval
每次d
是一个比当前bestval
更好的值(也就是更小的权重差异)时,会再次更新{。}}。
关键代码在这里......
if bestval == -1 or d < bestval:
bestval = d
因此,在循环的第一遍中,bestval == -1
为真,bestval
更新。之后,d < bestval
检查确定是否更新值。
答案 2 :(得分:0)
我怀疑通过所有组合是一种蛮力和解决问题的缓慢方法。
按尺寸对重量进行分类,然后从最重到最轻,将它们逐个添加到左侧或右侧,这取决于桩之间的重量差异,这可能会给出最佳答案。
下面的Psuedo代码,使其成为O(n)问题(如果忽略排序);
sort weights into stack;
while (weight = pop stack) {
if (sum(left) - sum(right) > 0) push weight on right
else push weight to left;
}
bestval = sum(left) - sum(right);
答案 3 :(得分:0)
贪婪算法表明IS是一种很好的启发式方法,但绝对不能保证提供最佳解决方案。这个问题是NP难的。它可以使用局部搜索(例如模拟退火)随机“解决” - 其中解决方案意味着“好”答案:一个被认为接近最优。 Knuth提出了这个问题,40个重量和3个罐子,重量等于1..40的平方根。
格里