3

我在一个包含“箱号”和“重量”列的表中有 30 条记录。我必须从 30 个箱子中找出总重量最接近 1000 公斤的箱子。

4

3 回答 3

5

我建议您阅读有关背包问题的信息

于 2012-07-27T10:07:24.250 回答
2

SQL 服务器:

select TOP 20 box_number 
from t_boxes 
group by box_number 
order by ABS(SUM(box_weight) - 1000) ASC

编辑:万一我误解了你的问题,你真的想解决背包问题。这是您在 SQL 中真正应该做的事情,但是您可以用非常恰当的名称阅读这篇文章:现在完全不恰当地使用 SQL Server

于 2012-07-27T10:05:03.453 回答
0

不推荐在 SQL 中解决此问题的方法,甚至可能在任何机器上都不可行。但是,您可以将蛮力解决方案表示为:

select box1.id, box2.id, . . . ,
       (box1.weight + box2.weight + . . .)
from box box1 join
     box box2
     on box2.id > box1.id join
     box box3
     on box3.id > box2.id join
     box box4
     on box4.id > box3.id
     . . .
     box box20
     on box20.id > box19.id
order by abs(1000 - (box1.weight + box2.weight + . . .))

“on”条件保证您查看每组框一次,按其唯一 ID 排序。使用“join”而不是“left join”可确保您最终得到正好 20 个框。

于 2012-07-27T13:59:30.827 回答