J'ai posé cette question sur Stack Overflow il y a un moment: Problème: la vente de Bob . Quelqu'un a également suggéré de poser la question ici.
Quelqu'un a déjà posé une question liée à ce problème ici - sous- forêt de poids minimum de cardinalité donnée - mais pour autant que je comprends cela ne m'aide pas avec mon problème. La réponse la mieux notée sur StackOverflow mérite également d'être examinée.
Voici la copie textuelle de ma question StackOverflow. Il est probablement mal formulé pour ce site (diable, je me sens mal éduqué juste en le demandant ici), alors n'hésitez pas à le modifier:
Remarque: il s'agit d'une reformulation abstraite d'un problème réel concernant la commande des enregistrements dans un fichier SWF. Une solution m'aidera à améliorer une application open-source.
Bob a un magasin et veut faire une vente. Son magasin propose un certain nombre de produits et il a une certaine quantité entière d'unités de chaque produit en stock. Il a également un certain nombre d'étiquettes de prix sur étagère (autant que le nombre de produits), avec les prix déjà imprimés sur eux. Il peut placer n'importe quelle étiquette de prix sur n'importe quel produit (prix unitaire pour un article pour tout son stock de ce produit), cependant certains produits ont une restriction supplémentaire - un tel produit peut ne pas être moins cher qu'un certain autre produit.
Vous devez trouver comment organiser les étiquettes de prix, de sorte que le coût total de toutes les marchandises de Bob soit aussi bas que possible. Le coût total est la somme de l'étiquette de prix attribuée à chaque produit multipliée par la quantité de ce produit en stock.
Donné:
- N - le nombre de produits et les étiquettes de prix
- S i , 0≤ i <N - la quantité en stock de produit d'indice i (entier)
- P j , 0≤ j <N - le prix sur l'étiquette de prix avec l'indice j (entier)
- K - le nombre de paires de contraintes supplémentaires
- A k , B k , 0≤ k <K - indices de produit pour la contrainte supplémentaire
- Tout indice de produit peut apparaître au plus une fois en B. Ainsi, le graphique formé par cette liste d'adjacence est en fait un ensemble d'arbres dirigés.
Le programme doit trouver:
- M i , 0≤ i <N - mappage de l'indice du produit à l'indice de l'étiquette de prix (P M i est le prix du produit i )
Pour satisfaire aux conditions:
- P M A k ≤ P M B k , pour 0≤ k <K
- Σ (S i × P M i ) pour 0≤ i <N est minimal
Notez que si ce n'est pas pour la première condition, la solution serait simplement de trier les étiquettes par prix et les produits par quantité, et de faire correspondre les deux directement.
Les valeurs typiques pour l'entrée seront N, K <10000. Dans le problème réel, il n'y a que plusieurs étiquettes de prix distinctes (1,2,3,4).
Voici un exemple des raisons pour lesquelles la plupart des solutions simples (y compris le tri topologique) ne fonctionneront pas:
Vous avez 10 articles avec les quantités 1 à 10, et 10 étiquettes de prix avec les prix 1 à $ 10. Il y a une condition: l'élément avec la quantité 10 ne doit pas être moins cher que l'élément avec la quantité 1.
La solution optimale est:
Price, $ 1 2 3 4 5 6 7 8 9 10
Qty 9 8 7 6 1 10 5 4 3 2
avec un coût total de Si vous placez la paire de 1,10 près de l'un ou l'autre extrême, le coût total sera plus élevé.