Eu fiz essa pergunta no Stack Overflow há um tempo atrás: Problema: a venda de Bob . Alguém sugeriu postar a pergunta aqui também.
Alguém já fez uma pergunta relacionada a esse problema aqui - subfloresta de peso mínimo de determinada cardinalidade - mas, pelo que entendi, não me ajuda com o meu problema. A resposta mais bem avaliada no StackOverflow também vale a pena olhar.
Aqui está a cópia literal da minha pergunta StackOverflow. Provavelmente, ele foi formulado de forma inadequada para este site (caramba, me sinto inadequadamente sem instrução apenas pedindo aqui), portanto, fique à vontade para editá-lo:
Nota: esta é uma reformulação abstrata de um problema da vida real em relação à solicitação de registros em um arquivo SWF. Uma solução me ajudará a melhorar um aplicativo de código aberto.
Bob tem uma loja e quer fazer uma venda. Sua loja possui vários produtos e ele possui uma certa quantidade inteira de unidades de cada produto em estoque. Ele também possui várias etiquetas de preço montadas em prateleiras (até o número de produtos), com os preços já impressos. Ele pode colocar qualquer etiqueta de preço em qualquer produto (preço unitário de um item para todo o estoque desse produto), no entanto, alguns produtos têm uma restrição adicional - esse produto pode não ser mais barato que um determinado produto.
Você deve descobrir como organizar as etiquetas de preço, de modo que o custo total de todos os produtos de Bob seja o mais baixo possível. O custo total é a soma da etiqueta de preço atribuída a cada produto multiplicada pela quantidade desse produto em estoque.
Dado:
- N - o número de produtos e etiquetas de preços
- S i , 0≤ i <N - a quantidade em estoque do produto com o índice i (número inteiro)
- P j , 0≤ j <N - o preço na etiqueta de preço com o índice j (número inteiro)
- K - o número de pares de restrições adicionais
- A k , B k , 0≤ k <K - índices de produto para a restrição adicional
- Qualquer índice de produto pode aparecer no máximo uma vez em B. Portanto, o gráfico formado por esta lista de adjacências é na verdade um conjunto de árvores direcionadas.
O programa deve encontrar:
- M i , 0≤ i <N - mapeamento do índice do produto para o índice da etiqueta de preço (P M i é o preço do produto i )
Para satisfazer as condições:
- P M A k ≤ P M B k , para 0≤ k <K
- Σ (S i × P M i ) para 0≤ i <N é mínimo
Observe que, se não fosse a primeira condição, a solução seria simplesmente classificar rótulos por preço e produtos por quantidade e combinar ambos diretamente.
Os valores típicos para entrada serão N, K <10000. No problema da vida real, existem apenas várias etiquetas de preço distintas (1,2,3,4).
Aqui está um exemplo de por que a maioria das soluções simples (incluindo classificação topológica) não funciona:
A solução ideal é:
Price, $ 1 2 3 4 5 6 7 8 9 10
Qty 9 8 7 6 1 10 5 4 3 2