最小的石堆

时间:2013-06-26 14:40:45

标签: python

问题:
您将获得整数权重列表。您需要将这些权重分配到两个集合中,以使每个集合的总权重之间的差异尽可能低 输入数据:权重列表 输出数据:表示可能的最低权重差异的数字。

我看到了答案,但我无法理解为什么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

4 个答案:

答案 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的平方根。

格里