2012-07-27 4 views
3

J'ai 30 enregistrements dans un tableau ayant la colonne "numéro de boîte" et "poids". Je dois trouver 20 boîtes sur 30 boîtes dont la somme de poids est la plus proche de 1000 kg.Requête SQL pour trouver le poids total

+0

Quel moteur sql utilisez-vous? BTW recherche pour «knapsack problème sql» pour certains conseils, car il ne sera pas trivial :) – biziclop

+0

Im utilisant le serveur SQL –

+0

Pourquoi avez-vous besoin d'utiliser SQL? Un langage de programmation est mieux adapté aux problèmes tels que celui-ci. Votre question manque [exemple de code] (http://sscce.org/) (ici, instructions SQL). Veuillez utiliser 'CREATE TABLE' et' INSERT ... VALUES' pour [samples] (http://weblogs.sqlteam.com/jeffs/archive/2008/05/13/question-needed-not-answer.aspx). Les résultats souhaités n'ont pas besoin d'être présentés comme un exemple de code, car les résultats sont la sortie du code et non le code eux-mêmes. – outis

Répondre

2

SQL Server:

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

Edit: Si j'ai mal compris votre question et vous voulez vraiment résoudre le problème de havresac. C'est quelque chose que vous devriez vraiment faire dans SQL, mais vous pouvez lire l'article this avec un nom très approprié: Et maintenant pour une utilisation complètement inappropriée de SQL Server.

0

La façon dont vous résoudre ce dans SQL n'est pas recommandé, et peut même ne pas être possible sur une machine. Mais, vous pouvez exprimer la solution de la force brute comme:

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

Le « sur » les conditions de garantie que vous cherchez à chaque série de boîtes une fois, commandés par leurs ids uniques. L'utilisation de "join" plutôt que "left join" garantit que vous vous retrouverez avec exactement 20 cases.

Questions connexes