Hace un tiempo hice esta pregunta sobre Stack Overflow: Problema: la venta de Bob . Alguien sugirió publicar la pregunta aquí también.
Alguien ya ha hecho una pregunta relacionada con este problema aquí: peso mínimo por debajo del bosque de la cardinalidad dada , pero, por lo que entiendo, no me ayuda con mi problema. También vale la pena ver la respuesta mejor calificada en StackOverflow.
Aquí está la copia literal de mi pregunta de StackOverflow. Probablemente esté formulado de manera inadecuada para este sitio (diablos, me siento inadecuadamente sin educación solo preguntándolo aquí), así que siéntase libre de editarlo:
Nota: esta es una redacción abstracta de un problema de la vida real con respecto al pedido de registros en un archivo SWF. Una solución me ayudará a mejorar una aplicación de código abierto.
Bob tiene una tienda y quiere hacer una venta. Su tienda tiene una serie de productos, y tiene una cierta cantidad entera de unidades de cada producto en stock. También tiene una serie de etiquetas de precios montadas en estantes (tanto como la cantidad de productos), con los precios ya impresos en ellas. Puede colocar cualquier etiqueta de precio en cualquier producto (precio unitario para un artículo para todo su stock de ese producto), sin embargo, algunos productos tienen una restricción adicional: cualquier producto de este tipo puede no ser más barato que cierto otro producto.
Debe encontrar cómo organizar las etiquetas de precios, de modo que el costo total de todas las mercancías de Bob sea lo más bajo posible. El costo total es la suma de la etiqueta de precio asignada de cada producto multiplicada por la cantidad de ese producto en stock.
Dado:
- N - el número de productos y etiquetas de precios
- S i , 0≤ i <N - la cantidad en stock del producto con índice i (entero)
- P j , 0≤ j <N - el precio en la etiqueta de precio con índice j (entero)
- K - el número de pares de restricciones adicionales
- A k , B k , 0≤ k <K - índices de producto para la restricción adicional
- Cualquier índice de producto puede aparecer como máximo una vez en B. Por lo tanto, el gráfico formado por esta lista de adyacencia es en realidad un conjunto de árboles dirigidos.
El programa debe encontrar:
- M i , 0≤ i <N - asignación del índice del producto al índice de la etiqueta de precio (P M i es el precio del producto i )
Para satisfacer las condiciones:
- P M A k ≤ P M B k , para 0≤ k <K
- Σ (S i × P M i ) para 0≤ i <N es mínimo
Tenga en cuenta que si no fuera por la primera condición, la solución sería simplemente ordenar las etiquetas por precio y productos por cantidad, y hacer coincidir ambos directamente.
Los valores típicos para la entrada serán N, K <10000. En el problema de la vida real, solo hay varias etiquetas de precio distintas (1,2,3,4).
Aquí hay un ejemplo de por qué las soluciones más simples (incluida la clasificación topológica) no funcionarán:
La solución óptima es:
Price, $ 1 2 3 4 5 6 7 8 9 10
Qty 9 8 7 6 1 10 5 4 3 2
con un costo total de 249. Si coloca el par 1,10 cerca de cualquier extremo, el costo total será mayor.