我在一个包含“箱号”和“重量”列的表中有 30 条记录。我必须从 30 个箱子中找出总重量最接近 1000 公斤的箱子。
问问题
1462 次
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 回答