Ho fatto questa domanda su Stack Overflow qualche tempo fa: Problema: vendita di Bob . Qualcuno ha suggerito di pubblicare la domanda anche qui.
Qualcuno ha già posto una domanda relativa a questo problema qui - Peso minimo della sottoforeste della cardinalità data - ma per quanto ho capito non mi aiuta con il mio problema. Anche la risposta più votata su StackOverflow è degna di nota.
Ecco la copia integrale della mia domanda StackOverflow. Probabilmente è formulato in modo inadeguato per questo sito (diamine, mi sento inadeguatamente non istruito solo chiedendolo qui), quindi sentiti libero di modificarlo:
Nota: questa è una riformulazione astratta di un problema di vita reale riguardante l'ordinazione di record in un file SWF. Una soluzione mi aiuterà a migliorare un'applicazione open source.
Bob ha un negozio e vuole fare una vendita. Il suo negozio trasporta un numero di prodotti e ha un certo numero intero di unità di ciascun prodotto in magazzino. Ha anche un numero di etichette dei prezzi montate su scaffale (fino al numero di prodotti), con i prezzi già stampati su di esse. Può apporre un'etichetta di prezzo su qualsiasi prodotto (prezzo unitario per un articolo per l'intero magazzino di quel prodotto), tuttavia alcuni prodotti hanno una restrizione aggiuntiva: tali prodotti potrebbero non essere più economici di un determinato altro prodotto.
Devi trovare come organizzare le etichette dei prezzi, in modo tale che il costo totale di tutte le merci di Bob sia il più basso possibile. Il costo totale è la somma dell'etichetta del prezzo assegnato a ciascun prodotto moltiplicata per la quantità di quel prodotto in magazzino.
Dato:
- N - il numero di prodotti e le etichette dei prezzi
- S i , 0≤ i <N - la quantità disponibile del prodotto con indice i (numero intero)
- P j , 0≤ j <N - il prezzo sull'etichetta del prezzo con indice j (intero)
- K: il numero di coppie di vincoli aggiuntive
- A k , B k , 0≤ k <K - indici di prodotto per il vincolo aggiuntivo
- Qualsiasi indice di prodotto può apparire al massimo una volta in B. Pertanto, il grafico formato da questo elenco di adiacenza è in realtà un insieme di alberi diretti.
Il programma deve trovare:
- M i , 0≤ i <N - mappatura dall'indice del prodotto all'indice dell'etichetta del prezzo (P M i è il prezzo del prodotto i )
Per soddisfare le condizioni:
- P M A k ≤ P M B k , per 0≤ k <K
- Σ (S i × P M i ) per 0≤ i <N è minimo
Nota che, se non fosse per la prima condizione, la soluzione sarebbe semplicemente quella di ordinare le etichette per prezzo e i prodotti per quantità, e di abbinarli entrambi direttamente.
I valori tipici per l'input saranno N, K <10000. Nel problema della vita reale, ci sono solo diversi prezzi distinti (1,2,3,4).
Ecco un esempio del perché la maggior parte delle soluzioni semplici (incluso l'ordinamento topologico) non funzionerà:
La soluzione ottimale è:
Price, $ 1 2 3 4 5 6 7 8 9 10
Qty 9 8 7 6 1 10 5 4 3 2