3

列「ボックス番号」と「重量」を持つテーブルに 30 のレコードがあります。30 個の箱のうち、重量の合計が 1000 kg に最も近い 20 個の箱を見つけなければなりません。

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 + . . .))

「オン」条件により、ボックスの各セットが一意の ID 順に並べられて 1 回表示されることが保証されます。「左結合」ではなく「結合」を使用すると、正確に 20 個のボックスが得られます。

于 2012-07-27T13:59:30.827 に答える