SlideShare uma empresa Scribd logo
1 de 47
Problema da mochila 0-1
Curso de Maratona de Programação
ICT-Unifesp – SJC
Paradigmas
• Guloso
• Realiza a escolha que parece ser a melhor no momento, ou seja, faz uma escolha ótima
local na esperança de que escolha leve até a solução ótima global.
• Será que sempre garante chegar a uma solução ótima global?
• Curiosidade: o algoritmo Dijkstra é guloso... (só guloso ??)
Paradigmas
• Backtracking
• Refinamento de busca por força bruta!
• Várias soluções podem ser eliminadas sem serem explicitamente examinadas.
Programação dinâmica
• Vários algoritmos eficientes utilizam esse paradigma.
• O termo “programação” significa planejamento.
• Estrutura recursiva:
• A solução de qualquer instância deve conter soluções de subinstâncias da instância.
• Representação por uma recorrência (algoritmo recursivo).
• O algoritmo recursivo é normalmente ineficiente porque refaz cálculos.
• Temos que construir uma tabela para memorizar os resultados de soluções de
subinstâncias (subproblemas) para evitar o recálculo!
Programação dinâmica
• Decomposição do problema em subproblemas.
• Pense na solução para cada subproblema.
• Subproblemas sobrepostos: resolve um determinado subproblema e mais a
frente precisa do resultado daquele subproblema que já foi resolvido.
• Reutilização das soluções (eficiência): podemos sair de um problema
exponencial para polinomial...
• Otimalidade: solução ótima é composta de soluções ótimas dos subproblemas
• O Dijkstra é só guloso? Não, é uma combinação de guloso e PD!
• Discussão: http://codeforces.com/blog/entry/20503
Programação dinâmica
• Hello World – não adianta, sempre Fibonacci estará presente!
• Normalmente o cálculo de Fibonacci é feito da seguinte forma:
• Isso é eficiente?
Programação dinâmica
• fib(6)
6
5 4
4 3 3 2
Ineficiente, já calculou o fib(3)... vai calcular novamente?
Programação dinâmica
• fib(6)
6
5 4
4 3 3 2
Temos repetições de subproblemas...
Programação dinâmica
• fib(6)
6
5 4
4 3 3 2
A abordagem é exponencial 
Programação dinâmica
• fib(6)
6
5 4
4 3 3 2
Se os subproblemas se repetem, basta guardar os
resultados dos problemas já resolvidos!
Programação dinâmica
• Como usar PD? Basta fazer uma memorização dos resultados:
memorizando o resultado...
já calculei?
Programação dinâmica
• Como usar PD? Basta fazer uma memorização dos resultados:
Transformamos algo exponencial em linear.
Programação dinâmica
• Essa é uma abordagem top-down , ou seja, tentamos calcular o fib(n)
antes de todo mundo...
Programação dinâmica
• Abordagem bottom-up:
• Removemos a chamada recursiva, criamos um array para guardar os
resultados e fomos construindo de trás para frente!
Problema da mochila 0-1
• Digamos que você possui objetos onde cada objeto possui um peso e valor.
• Digamos que você também possui uma mochila que possui uma capacidade
máxima (peso máximo suportado).
• Seu objetivo é: levar um conjunto de objetos cujo valor total seja máximo e o
peso total não ultrapasse a capacidade da mochila.
• Resumindo: você quer maximizar o valor de forma que não ultrapasse a
capacidade máxima da mochila.
Problema da mochila 0-1
• Objetos: X1, X2, ... , Xn
• Valores: V1, V2, ... , Vn
• Pesos: P1, P2, ... , Pn
• Peso máximo da mochila: P
• Qual aplicação disso?
• Maximizar o lucro...
• Maximizar a quantidade de brinquedos...
• Maximizar a felicidade...
Problema da mochila 0-1
• Trata-se de um problema difícil, vários refinamentos foram feitos até se chegar
a uma solução legal... Don’t panic!
• Como encontrar uma composição de objetos que maximize o valor
respeitando a restrição da capacidade máxima da mochila?
• Uma abordagem: guloso.
Problema da mochila 0-1
• Utilizando abordagem gulosa:
• Ordena os objetos pelo valor máximo e vai pegando cada objeto se não ultrapassar a
capacidade máxima da mochila.
• Também pode-se ordenar pelo (valor / peso)...
• Garante chegar a solução ótima global?
• De acordo com a estratégia gulosa de pegar pelo maior valor, colocaria o item X3 (maior
valor), mas não poderia colocar nenhum item a mais. Uma solução melhor é pegar os
itens X1 e X2 totalizando o valor 35 (> 30).
Capacidade: 20 X1 X2 X3
Pi 10 10 20
Vi 15 20 30
Problema da mochila 0-1
• Por que 0-1 ? Ou o objeto está ou não está na mochila.
• Estratégia gulosa pode garantir uma boa aproximação, mas não garante a
solução ótima global. Vamos tentar por programação dinâmica...
• Temos que reduzir o problema, chegarmos a uma solução recursiva.
• Com a redução do problema, teremos subproblemas.
• Resolve os subproblemas (cálculos menores)...
• Faz-se uma observação e...
• É difícil esboçar um algoritmo!
Problema da mochila 0-1
• Qual a observação?
“O objeto Xn pode está ou não está na solução ótima.”
20
Problema da mochila 0-1
• Se um objeto Xn está na mochila, então a composição ótima da mochila é esse
objeto mais os demais descontando o peso desse objeto!
• Considere P (capacidade da mochila) = 20.
• Pn = 8 (peso do objeto “n”).
• A mochila terá (Xn + (n – 1)) objetos cujo peso máximo é 12 (descontou peso do objeto).
• É como se tivesse compondo uma outra mochila...
• Se o objeto não está na solução ótima, então a solução ótima é a mochila com
peso original composta pelos (n – 1) elementos.
• Compara-se o máximo desses dois casos, queremos maximizar...
21
Problema da mochila 0-1
• Se Xn pertence à solução, então o valor dessa solução será:
• Vn + (valor de uma solução ótima com uma mochila de capacidade P – Pn) considerando
os (n – 1) primeiros itens.
• Como descrevemos isso?
• Como transformar numa solução?
22
Problema da mochila 0-1
• Temos os parâmetros:
• Conjuto dos objetos
• Peso da mochila
• Como captar esses parâmetros?
• f(i, p) -> valor ótimo considerando os “i” primeiros itens e uma mochila de
capacidade p.
f(i, p)
23
objetos que estou considerando,
os “i” primeiros objetos
p é p peso que a mochila suporta
Problema da mochila 0-1
• Se Xn está na solução ótima:
• f(n – 1, p – pn) + Vn
• (n – 1) -> considera agora somente os “n – 1” primeiros itens.
• (p – pn) -> desconta o peso (pn) do objeto “n”. “p” é a capacidade da mochila.
• Se o objeto “n” está na solução ótima, ele leva o valor dele, por isso o “+ Vn”.
• Se Xn não está na solução ótima:
• f(n – 1, p)
• (n – 1) -> considera agora somente os “n – 1” primeiros itens.
• p -> não desconta o peso dele, pois ele não está na solução ótima...
• Resolva fazendo o máximo (max) desses dois casos...
24
Problema da mochila 0-1
• O objetivo é o cálculo do f(n), ou seja, para “n” objetos.
• Iremos resolver de baixo para cima (bottom-up).
• Calculando valores pequenos e aumentando os valores da função “f” até
chegar no f(n, p).
25
Problema da mochila 0-1
• Recorrência:
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
• f(i, p) = f(i – 1, p) se pi > p
• O i-ésimo item cabe na mochila? Se pi > p, então ele não cabe na mochila, esqueça ele e
olhe para os “i – 1” primeiros itens.
• f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
• Se pi <= p, calcula-se o máximo dos 2 casos: está ou não na mochila?
• O primeiro considera o item na mochila e o segundo não considera o item na mochila.
26
Problema da mochila 0-1
27
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
Problema da mochila 0-1
28
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
f(0, p) = f(i, 0) = 0
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0 0
1 0
2 0
3 0
4 0
i
Problema da mochila 0-1
29
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
Vamos calcular o f(1, 1): 1 item e mochila de peso 1
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0 0
1 0 ?
2 0
3 0
4 0
i
Problema da mochila 0-1
30
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
P1 > P? 2 > 1? Sim, então não cabe, resposta: f(i – 1, 1) = f(1 – 1, 1) = f(0, 1) = 0
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0 0
1 0 ?
2 0
3 0
4 0
i
Problema da mochila 0-1
31
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
Vamos calcular o f(1, 2): 1 item e mochila de peso 2
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0 0
1 0 0 ?
2 0
3 0
4 0
i
Problema da mochila 0-1
32
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
P1 > P ? 2 > 2 ? Não, então vamos calcular o max ...
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0 0
1 0 0 ?
2 0
3 0
4 0
i
Problema da mochila 0-1
33
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
f(i – 1, p – pi) + vi = f(0, 0) + 10 = 0 + 10 = 10
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0 0
1 0 0 ?
2 0
3 0
4 0
i
Problema da mochila 0-1
34
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
e f(i – 1, p) = f(0, 2) = 0
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0 0
1 0 0 ?
2 0
3 0
4 0
i
Problema da mochila 0-1
35
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
max(10, 0) = 10
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0 0
1 0 0 10
2 0
3 0
4 0
i
Problema da mochila 0-1
36
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
depois de implementar e olhar o resultado da matriz...
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0
1 0 0 10 10 10 10 10 10
2 0 7 10 17 17 17 17 17
3 0 7 10 17 17 17 25 32
4 0 7 10 17 17 24 31 ?
i
Problema da mochila 0-1
37
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
f(4, 7) é o valor máximo
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0
1 0 0 10 10 10 10 10 10
2 0 7 10 17 17 17 17 17
3 0 7 10 17 17 17 25 32
4 0 7 10 17 17 24 31 ?
i
Problema da mochila 0-1
38
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
P4 > P ? 5 > 7 ? Não, então vamos calcular o max ...
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0
1 0 0 10 10 10 10 10 10
2 0 7 10 17 17 17 17 17
3 0 7 10 17 17 17 25 32
4 0 7 10 17 17 24 31 ?
i
Problema da mochila 0-1
39
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
f(3, 2) + v4 = 10 + 24 = 34
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0
1 0 0 10 10 10 10 10 10
2 0 7 10 17 17 17 17 17
3 0 7 10 17 17 17 25 32
4 0 7 10 17 17 24 31 ?
i
Problema da mochila 0-1
40
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
f(3, 7) = 32
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0
1 0 0 10 10 10 10 10 10
2 0 7 10 17 17 17 17 17
3 0 7 10 17 17 17 25 32
4 0 7 10 17 17 24 31 ?
i
Problema da mochila 0-1
41
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
max( f(3, 2) + 24 ; f(3, 7) ) = max(34, 32) = 34
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0
1 0 0 10 10 10 10 10 10
2 0 7 10 17 17 17 17 17
3 0 7 10 17 17 17 25 32
4 0 7 10 17 17 24 31 ?
i
Problema da mochila 0-1
42
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
34 é o valor máximo!
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0
1 0 0 10 10 10 10 10 10
2 0 7 10 17 17 17 17 17
3 0 7 10 17 17 17 25 32
4 0 7 10 17 17 24 31 34
i
Problema da mochila 0-1
43
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
Qual a composição? Guarde os apontadores 
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0
1 0 0 10 10 10 10 10 10
2 0 7 10 17 17 17 17 17
3 0 7 10 17 17 17 25 32
4 0 7 10 17 17 24 31 34
i
Problema da mochila 0-1
44
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
De onde o 34 veio? Do f(3, 2), então o X4 faz parte da solução.
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0
1 0 0 10 10 10 10 10 10
2 0 7 10 17 17 17 17 17
3 0 7 10 17 17 17 25 32
4 0 7 10 17 17 24 31 34
i
Problema da mochila 0-1
45
P: 7 X1 X2 X3 X4
Vi 10 7 25 24
Pi 2 1 6 5
f(i, p) = f(i – 1, p) se pi > p
f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
De onde veio f(1, 2) ? Veio do f(0, 0) + 10, então o X1 faz parte da solução.
0 1 2 3 4 5 6 7 P
0 0 0 0 0 0 0 0 0
1 0 0 10 10 10 10 10 10
2 0 7 10 17 17 17 17 17
3 0 7 10 17 17 17 25 32
4 0 7 10 17 17 24 31 34
i
Problema da mochila 0-1
• Complexidade: O(n * P)
• “n” é a quantidade de itens.
• “P” é a capacidade máxima da mochila.
• Depende do “P”, portanto, é pseudo-polinomial.
Problema da mochila 0-1
• Implementação em C++:
• https://goo.gl/87o8U9
• Vídeo-aula:
• https://goo.gl/9syeQP
• Dúvidas?
• mcastrosouza@live.com

Mais conteúdo relacionado

Mais procurados

Aula 9 - profmat - os teoremas de euler e wilson 27 10-17
Aula 9  - profmat - os teoremas de euler e wilson 27 10-17Aula 9  - profmat - os teoremas de euler e wilson 27 10-17
Aula 9 - profmat - os teoremas de euler e wilson 27 10-17Aline Guedes
 
Análise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaAnálise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaDelacyr Ferreira
 
Análise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasAnálise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasDelacyr Ferreira
 
Análise de Algoritmos - Indução Finita
Análise de Algoritmos - Indução FinitaAnálise de Algoritmos - Indução Finita
Análise de Algoritmos - Indução FinitaDelacyr Ferreira
 
PROBLEMA DA MOCHILA VALIOSA COM VALOR MINIMO DE UTILIDADE
PROBLEMA DA MOCHILA VALIOSA COM VALOR MINIMO DE UTILIDADEPROBLEMA DA MOCHILA VALIOSA COM VALOR MINIMO DE UTILIDADE
PROBLEMA DA MOCHILA VALIOSA COM VALOR MINIMO DE UTILIDADEJoao Gonçalves
 
Caminhos Mínimos - Algoritmo de Dijkstra
Caminhos Mínimos - Algoritmo de DijkstraCaminhos Mínimos - Algoritmo de Dijkstra
Caminhos Mínimos - Algoritmo de DijkstraMarcos Castro
 
Implicação Lógica
Implicação LógicaImplicação Lógica
Implicação LógicaHugo Souza
 
Elementos de Matemática Básica - Equações e Inequações
Elementos de Matemática Básica - Equações e InequaçõesElementos de Matemática Básica - Equações e Inequações
Elementos de Matemática Básica - Equações e InequaçõesMilton Henrique do Couto Neto
 
Lista de Exercícios - Linguagem Formais e Autômatos
Lista de Exercícios - Linguagem Formais e AutômatosLista de Exercícios - Linguagem Formais e Autômatos
Lista de Exercícios - Linguagem Formais e AutômatosTárcio Sales
 
Exercício resolvido normalização
Exercício resolvido normalizaçãoExercício resolvido normalização
Exercício resolvido normalizaçãoTicianne Darin
 
Analise de Sensibilidade
Analise de SensibilidadeAnalise de Sensibilidade
Analise de SensibilidadeVivi Basilio
 
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...Aline Guedes
 
Apresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonApresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonPriscila Mayumi
 
Bellman ford algorithm
Bellman ford algorithmBellman ford algorithm
Bellman ford algorithmRuchika Sinha
 

Mais procurados (20)

Algoritmo Shell Sort
Algoritmo Shell SortAlgoritmo Shell Sort
Algoritmo Shell Sort
 
01 introducao e conceitos basicos
01   introducao e conceitos basicos01   introducao e conceitos basicos
01 introducao e conceitos basicos
 
Aula 9 - profmat - os teoremas de euler e wilson 27 10-17
Aula 9  - profmat - os teoremas de euler e wilson 27 10-17Aula 9  - profmat - os teoremas de euler e wilson 27 10-17
Aula 9 - profmat - os teoremas de euler e wilson 27 10-17
 
Análise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise AssintóticaAnálise de Algoritmos - Análise Assintótica
Análise de Algoritmos - Análise Assintótica
 
Análise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de RecorrênciasAnálise de Algoritmos - Solução de Recorrências
Análise de Algoritmos - Solução de Recorrências
 
Análise de Algoritmos - Indução Finita
Análise de Algoritmos - Indução FinitaAnálise de Algoritmos - Indução Finita
Análise de Algoritmos - Indução Finita
 
PROBLEMA DA MOCHILA VALIOSA COM VALOR MINIMO DE UTILIDADE
PROBLEMA DA MOCHILA VALIOSA COM VALOR MINIMO DE UTILIDADEPROBLEMA DA MOCHILA VALIOSA COM VALOR MINIMO DE UTILIDADE
PROBLEMA DA MOCHILA VALIOSA COM VALOR MINIMO DE UTILIDADE
 
Minimum spanning tree
Minimum spanning treeMinimum spanning tree
Minimum spanning tree
 
Caminhos Mínimos - Algoritmo de Dijkstra
Caminhos Mínimos - Algoritmo de DijkstraCaminhos Mínimos - Algoritmo de Dijkstra
Caminhos Mínimos - Algoritmo de Dijkstra
 
Implicação Lógica
Implicação LógicaImplicação Lógica
Implicação Lógica
 
Aula 05 derivadas - conceitos iniciais
Aula 05   derivadas - conceitos iniciaisAula 05   derivadas - conceitos iniciais
Aula 05 derivadas - conceitos iniciais
 
Elementos de Matemática Básica - Equações e Inequações
Elementos de Matemática Básica - Equações e InequaçõesElementos de Matemática Básica - Equações e Inequações
Elementos de Matemática Básica - Equações e Inequações
 
Programacao linear aula 3 metodo grafico
Programacao linear   aula 3 metodo graficoProgramacao linear   aula 3 metodo grafico
Programacao linear aula 3 metodo grafico
 
Lista de Exercícios - Linguagem Formais e Autômatos
Lista de Exercícios - Linguagem Formais e AutômatosLista de Exercícios - Linguagem Formais e Autômatos
Lista de Exercícios - Linguagem Formais e Autômatos
 
Exercício resolvido normalização
Exercício resolvido normalizaçãoExercício resolvido normalização
Exercício resolvido normalização
 
Analise de Sensibilidade
Analise de SensibilidadeAnalise de Sensibilidade
Analise de Sensibilidade
 
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...
Aula 5- Profmat-Aplicacoes do mdc - Equacoes diofantinas - Expressoes binomia...
 
Função polinomial do 1º grau
Função polinomial do 1º grauFunção polinomial do 1º grau
Função polinomial do 1º grau
 
Apresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação PythonApresentando a Linguagem de Programação Python
Apresentando a Linguagem de Programação Python
 
Bellman ford algorithm
Bellman ford algorithmBellman ford algorithm
Bellman ford algorithm
 

Destaque

Problema das N rainhas (Backtracking)
Problema das N rainhas (Backtracking)Problema das N rainhas (Backtracking)
Problema das N rainhas (Backtracking)Marcos Castro
 
Estruturas de dados com C++ e STL
Estruturas de dados com C++ e STLEstruturas de dados com C++ e STL
Estruturas de dados com C++ e STLMarcos Castro
 
Expressões Regulares com Python 3
Expressões Regulares com Python 3Expressões Regulares com Python 3
Expressões Regulares com Python 3Marcos Castro
 
Python - Dicionários
Python - DicionáriosPython - Dicionários
Python - DicionáriosMarcos Castro
 
Listas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionáriosListas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionáriosMarcos Castro
 
Backtracking - Gerar todos os subconjuntos
Backtracking - Gerar todos os subconjuntosBacktracking - Gerar todos os subconjuntos
Backtracking - Gerar todos os subconjuntosMarcos Castro
 
Algoritmo de Knuth-Morris-Pratt - KMP
Algoritmo de Knuth-Morris-Pratt - KMPAlgoritmo de Knuth-Morris-Pratt - KMP
Algoritmo de Knuth-Morris-Pratt - KMPMarcos Castro
 
Maratona de Programação
Maratona de ProgramaçãoMaratona de Programação
Maratona de ProgramaçãoMarcos Castro
 
Algoritmos Genéticos Aplicados ao Problema da Mochila Multidimensional
Algoritmos Genéticos Aplicados ao Problema da Mochila MultidimensionalAlgoritmos Genéticos Aplicados ao Problema da Mochila Multidimensional
Algoritmos Genéticos Aplicados ao Problema da Mochila MultidimensionalBianca Dantas
 
Redes Neurais Artificiais
Redes Neurais ArtificiaisRedes Neurais Artificiais
Redes Neurais ArtificiaisMarcos Castro
 
O caixeiro viajante é np completo
O caixeiro viajante é np completoO caixeiro viajante é np completo
O caixeiro viajante é np completoMarcelo Carvalho
 
Agrupamento (clustering) - K-Means
Agrupamento (clustering) - K-MeansAgrupamento (clustering) - K-Means
Agrupamento (clustering) - K-MeansMarcos Castro
 
Busca em largura - BFS
Busca em largura - BFSBusca em largura - BFS
Busca em largura - BFSMarcos Castro
 
Programação dinâmica
Programação dinâmicaProgramação dinâmica
Programação dinâmicaMarcos Castro
 
Análise Assintótica
Análise AssintóticaAnálise Assintótica
Análise AssintóticaMarcos Castro
 

Destaque (20)

Problema das N rainhas (Backtracking)
Problema das N rainhas (Backtracking)Problema das N rainhas (Backtracking)
Problema das N rainhas (Backtracking)
 
Estruturas de dados com C++ e STL
Estruturas de dados com C++ e STLEstruturas de dados com C++ e STL
Estruturas de dados com C++ e STL
 
Expressões Regulares com Python 3
Expressões Regulares com Python 3Expressões Regulares com Python 3
Expressões Regulares com Python 3
 
Python - Dicionários
Python - DicionáriosPython - Dicionários
Python - Dicionários
 
Listas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionáriosListas, tuplas, conjuntos e dicionários
Listas, tuplas, conjuntos e dicionários
 
Backtracking - Gerar todos os subconjuntos
Backtracking - Gerar todos os subconjuntosBacktracking - Gerar todos os subconjuntos
Backtracking - Gerar todos os subconjuntos
 
Algoritmo de Knuth-Morris-Pratt - KMP
Algoritmo de Knuth-Morris-Pratt - KMPAlgoritmo de Knuth-Morris-Pratt - KMP
Algoritmo de Knuth-Morris-Pratt - KMP
 
Maratona de Programação
Maratona de ProgramaçãoMaratona de Programação
Maratona de Programação
 
Algoritmos Genéticos Aplicados ao Problema da Mochila Multidimensional
Algoritmos Genéticos Aplicados ao Problema da Mochila MultidimensionalAlgoritmos Genéticos Aplicados ao Problema da Mochila Multidimensional
Algoritmos Genéticos Aplicados ao Problema da Mochila Multidimensional
 
Redes Neurais Artificiais
Redes Neurais ArtificiaisRedes Neurais Artificiais
Redes Neurais Artificiais
 
O caixeiro viajante é np completo
O caixeiro viajante é np completoO caixeiro viajante é np completo
O caixeiro viajante é np completo
 
Tabela Hash
Tabela HashTabela Hash
Tabela Hash
 
Agrupamento (clustering) - K-Means
Agrupamento (clustering) - K-MeansAgrupamento (clustering) - K-Means
Agrupamento (clustering) - K-Means
 
Python - Set
Python - SetPython - Set
Python - Set
 
Fila de prioridades
Fila de prioridadesFila de prioridades
Fila de prioridades
 
Binary heap
Binary heapBinary heap
Binary heap
 
Busca em largura - BFS
Busca em largura - BFSBusca em largura - BFS
Busca em largura - BFS
 
Algoritmos gulosos
Algoritmos gulososAlgoritmos gulosos
Algoritmos gulosos
 
Programação dinâmica
Programação dinâmicaProgramação dinâmica
Programação dinâmica
 
Análise Assintótica
Análise AssintóticaAnálise Assintótica
Análise Assintótica
 

Mais de Marcos Castro

Árvores de Decisão
Árvores de DecisãoÁrvores de Decisão
Árvores de DecisãoMarcos Castro
 
Colored de Bruijn Graphs
Colored de Bruijn GraphsColored de Bruijn Graphs
Colored de Bruijn GraphsMarcos Castro
 
Maratona de Programação
Maratona de ProgramaçãoMaratona de Programação
Maratona de ProgramaçãoMarcos Castro
 
Ferramentas para Bioinformática
Ferramentas para BioinformáticaFerramentas para Bioinformática
Ferramentas para BioinformáticaMarcos Castro
 
A importância da Bioinformática
A importância da BioinformáticaA importância da Bioinformática
A importância da BioinformáticaMarcos Castro
 
Problema do Caixeiro Viajante
Problema do Caixeiro ViajanteProblema do Caixeiro Viajante
Problema do Caixeiro ViajanteMarcos Castro
 
Metaheurística Simulated Annealing
Metaheurística Simulated AnnealingMetaheurística Simulated Annealing
Metaheurística Simulated AnnealingMarcos Castro
 
Agrupamento de sequências biológicas
Agrupamento de sequências biológicasAgrupamento de sequências biológicas
Agrupamento de sequências biológicasMarcos Castro
 
Longest palindromic subsequence (LPS)
Longest palindromic subsequence (LPS)Longest palindromic subsequence (LPS)
Longest palindromic subsequence (LPS)Marcos Castro
 
Bioinformática com Biopython
Bioinformática com BiopythonBioinformática com Biopython
Bioinformática com BiopythonMarcos Castro
 

Mais de Marcos Castro (13)

Árvores de Decisão
Árvores de DecisãoÁrvores de Decisão
Árvores de Decisão
 
Colored de Bruijn Graphs
Colored de Bruijn GraphsColored de Bruijn Graphs
Colored de Bruijn Graphs
 
Maratona de Programação
Maratona de ProgramaçãoMaratona de Programação
Maratona de Programação
 
Bioinformática
BioinformáticaBioinformática
Bioinformática
 
Arquivos FASTQ
Arquivos FASTQArquivos FASTQ
Arquivos FASTQ
 
Ferramentas para Bioinformática
Ferramentas para BioinformáticaFerramentas para Bioinformática
Ferramentas para Bioinformática
 
A importância da Bioinformática
A importância da BioinformáticaA importância da Bioinformática
A importância da Bioinformática
 
Bioinformática
BioinformáticaBioinformática
Bioinformática
 
Problema do Caixeiro Viajante
Problema do Caixeiro ViajanteProblema do Caixeiro Viajante
Problema do Caixeiro Viajante
 
Metaheurística Simulated Annealing
Metaheurística Simulated AnnealingMetaheurística Simulated Annealing
Metaheurística Simulated Annealing
 
Agrupamento de sequências biológicas
Agrupamento de sequências biológicasAgrupamento de sequências biológicas
Agrupamento de sequências biológicas
 
Longest palindromic subsequence (LPS)
Longest palindromic subsequence (LPS)Longest palindromic subsequence (LPS)
Longest palindromic subsequence (LPS)
 
Bioinformática com Biopython
Bioinformática com BiopythonBioinformática com Biopython
Bioinformática com Biopython
 

Problema da Mochila 0-1 (Knapsack problem)

  • 1. Problema da mochila 0-1 Curso de Maratona de Programação ICT-Unifesp – SJC
  • 2. Paradigmas • Guloso • Realiza a escolha que parece ser a melhor no momento, ou seja, faz uma escolha ótima local na esperança de que escolha leve até a solução ótima global. • Será que sempre garante chegar a uma solução ótima global? • Curiosidade: o algoritmo Dijkstra é guloso... (só guloso ??)
  • 3. Paradigmas • Backtracking • Refinamento de busca por força bruta! • Várias soluções podem ser eliminadas sem serem explicitamente examinadas.
  • 4. Programação dinâmica • Vários algoritmos eficientes utilizam esse paradigma. • O termo “programação” significa planejamento. • Estrutura recursiva: • A solução de qualquer instância deve conter soluções de subinstâncias da instância. • Representação por uma recorrência (algoritmo recursivo). • O algoritmo recursivo é normalmente ineficiente porque refaz cálculos. • Temos que construir uma tabela para memorizar os resultados de soluções de subinstâncias (subproblemas) para evitar o recálculo!
  • 5. Programação dinâmica • Decomposição do problema em subproblemas. • Pense na solução para cada subproblema. • Subproblemas sobrepostos: resolve um determinado subproblema e mais a frente precisa do resultado daquele subproblema que já foi resolvido. • Reutilização das soluções (eficiência): podemos sair de um problema exponencial para polinomial... • Otimalidade: solução ótima é composta de soluções ótimas dos subproblemas • O Dijkstra é só guloso? Não, é uma combinação de guloso e PD! • Discussão: http://codeforces.com/blog/entry/20503
  • 6. Programação dinâmica • Hello World – não adianta, sempre Fibonacci estará presente! • Normalmente o cálculo de Fibonacci é feito da seguinte forma: • Isso é eficiente?
  • 7. Programação dinâmica • fib(6) 6 5 4 4 3 3 2 Ineficiente, já calculou o fib(3)... vai calcular novamente?
  • 8. Programação dinâmica • fib(6) 6 5 4 4 3 3 2 Temos repetições de subproblemas...
  • 9. Programação dinâmica • fib(6) 6 5 4 4 3 3 2 A abordagem é exponencial 
  • 10. Programação dinâmica • fib(6) 6 5 4 4 3 3 2 Se os subproblemas se repetem, basta guardar os resultados dos problemas já resolvidos!
  • 11. Programação dinâmica • Como usar PD? Basta fazer uma memorização dos resultados: memorizando o resultado... já calculei?
  • 12. Programação dinâmica • Como usar PD? Basta fazer uma memorização dos resultados: Transformamos algo exponencial em linear.
  • 13. Programação dinâmica • Essa é uma abordagem top-down , ou seja, tentamos calcular o fib(n) antes de todo mundo...
  • 14. Programação dinâmica • Abordagem bottom-up: • Removemos a chamada recursiva, criamos um array para guardar os resultados e fomos construindo de trás para frente!
  • 15. Problema da mochila 0-1 • Digamos que você possui objetos onde cada objeto possui um peso e valor. • Digamos que você também possui uma mochila que possui uma capacidade máxima (peso máximo suportado). • Seu objetivo é: levar um conjunto de objetos cujo valor total seja máximo e o peso total não ultrapasse a capacidade da mochila. • Resumindo: você quer maximizar o valor de forma que não ultrapasse a capacidade máxima da mochila.
  • 16. Problema da mochila 0-1 • Objetos: X1, X2, ... , Xn • Valores: V1, V2, ... , Vn • Pesos: P1, P2, ... , Pn • Peso máximo da mochila: P • Qual aplicação disso? • Maximizar o lucro... • Maximizar a quantidade de brinquedos... • Maximizar a felicidade...
  • 17. Problema da mochila 0-1 • Trata-se de um problema difícil, vários refinamentos foram feitos até se chegar a uma solução legal... Don’t panic! • Como encontrar uma composição de objetos que maximize o valor respeitando a restrição da capacidade máxima da mochila? • Uma abordagem: guloso.
  • 18. Problema da mochila 0-1 • Utilizando abordagem gulosa: • Ordena os objetos pelo valor máximo e vai pegando cada objeto se não ultrapassar a capacidade máxima da mochila. • Também pode-se ordenar pelo (valor / peso)... • Garante chegar a solução ótima global? • De acordo com a estratégia gulosa de pegar pelo maior valor, colocaria o item X3 (maior valor), mas não poderia colocar nenhum item a mais. Uma solução melhor é pegar os itens X1 e X2 totalizando o valor 35 (> 30). Capacidade: 20 X1 X2 X3 Pi 10 10 20 Vi 15 20 30
  • 19. Problema da mochila 0-1 • Por que 0-1 ? Ou o objeto está ou não está na mochila. • Estratégia gulosa pode garantir uma boa aproximação, mas não garante a solução ótima global. Vamos tentar por programação dinâmica... • Temos que reduzir o problema, chegarmos a uma solução recursiva. • Com a redução do problema, teremos subproblemas. • Resolve os subproblemas (cálculos menores)... • Faz-se uma observação e... • É difícil esboçar um algoritmo!
  • 20. Problema da mochila 0-1 • Qual a observação? “O objeto Xn pode está ou não está na solução ótima.” 20
  • 21. Problema da mochila 0-1 • Se um objeto Xn está na mochila, então a composição ótima da mochila é esse objeto mais os demais descontando o peso desse objeto! • Considere P (capacidade da mochila) = 20. • Pn = 8 (peso do objeto “n”). • A mochila terá (Xn + (n – 1)) objetos cujo peso máximo é 12 (descontou peso do objeto). • É como se tivesse compondo uma outra mochila... • Se o objeto não está na solução ótima, então a solução ótima é a mochila com peso original composta pelos (n – 1) elementos. • Compara-se o máximo desses dois casos, queremos maximizar... 21
  • 22. Problema da mochila 0-1 • Se Xn pertence à solução, então o valor dessa solução será: • Vn + (valor de uma solução ótima com uma mochila de capacidade P – Pn) considerando os (n – 1) primeiros itens. • Como descrevemos isso? • Como transformar numa solução? 22
  • 23. Problema da mochila 0-1 • Temos os parâmetros: • Conjuto dos objetos • Peso da mochila • Como captar esses parâmetros? • f(i, p) -> valor ótimo considerando os “i” primeiros itens e uma mochila de capacidade p. f(i, p) 23 objetos que estou considerando, os “i” primeiros objetos p é p peso que a mochila suporta
  • 24. Problema da mochila 0-1 • Se Xn está na solução ótima: • f(n – 1, p – pn) + Vn • (n – 1) -> considera agora somente os “n – 1” primeiros itens. • (p – pn) -> desconta o peso (pn) do objeto “n”. “p” é a capacidade da mochila. • Se o objeto “n” está na solução ótima, ele leva o valor dele, por isso o “+ Vn”. • Se Xn não está na solução ótima: • f(n – 1, p) • (n – 1) -> considera agora somente os “n – 1” primeiros itens. • p -> não desconta o peso dele, pois ele não está na solução ótima... • Resolva fazendo o máximo (max) desses dois casos... 24
  • 25. Problema da mochila 0-1 • O objetivo é o cálculo do f(n), ou seja, para “n” objetos. • Iremos resolver de baixo para cima (bottom-up). • Calculando valores pequenos e aumentando os valores da função “f” até chegar no f(n, p). 25
  • 26. Problema da mochila 0-1 • Recorrência: f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p • f(i, p) = f(i – 1, p) se pi > p • O i-ésimo item cabe na mochila? Se pi > p, então ele não cabe na mochila, esqueça ele e olhe para os “i – 1” primeiros itens. • f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p • Se pi <= p, calcula-se o máximo dos 2 casos: está ou não na mochila? • O primeiro considera o item na mochila e o segundo não considera o item na mochila. 26
  • 27. Problema da mochila 0-1 27 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p
  • 28. Problema da mochila 0-1 28 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p f(0, p) = f(i, 0) = 0 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 0 1 0 2 0 3 0 4 0 i
  • 29. Problema da mochila 0-1 29 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p Vamos calcular o f(1, 1): 1 item e mochila de peso 1 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 0 1 0 ? 2 0 3 0 4 0 i
  • 30. Problema da mochila 0-1 30 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p P1 > P? 2 > 1? Sim, então não cabe, resposta: f(i – 1, 1) = f(1 – 1, 1) = f(0, 1) = 0 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 0 1 0 ? 2 0 3 0 4 0 i
  • 31. Problema da mochila 0-1 31 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p Vamos calcular o f(1, 2): 1 item e mochila de peso 2 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 0 1 0 0 ? 2 0 3 0 4 0 i
  • 32. Problema da mochila 0-1 32 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p P1 > P ? 2 > 2 ? Não, então vamos calcular o max ... 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 0 1 0 0 ? 2 0 3 0 4 0 i
  • 33. Problema da mochila 0-1 33 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p f(i – 1, p – pi) + vi = f(0, 0) + 10 = 0 + 10 = 10 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 0 1 0 0 ? 2 0 3 0 4 0 i
  • 34. Problema da mochila 0-1 34 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p e f(i – 1, p) = f(0, 2) = 0 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 0 1 0 0 ? 2 0 3 0 4 0 i
  • 35. Problema da mochila 0-1 35 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p max(10, 0) = 10 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 0 1 0 0 10 2 0 3 0 4 0 i
  • 36. Problema da mochila 0-1 36 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p depois de implementar e olhar o resultado da matriz... 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 1 0 0 10 10 10 10 10 10 2 0 7 10 17 17 17 17 17 3 0 7 10 17 17 17 25 32 4 0 7 10 17 17 24 31 ? i
  • 37. Problema da mochila 0-1 37 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p f(4, 7) é o valor máximo 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 1 0 0 10 10 10 10 10 10 2 0 7 10 17 17 17 17 17 3 0 7 10 17 17 17 25 32 4 0 7 10 17 17 24 31 ? i
  • 38. Problema da mochila 0-1 38 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p P4 > P ? 5 > 7 ? Não, então vamos calcular o max ... 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 1 0 0 10 10 10 10 10 10 2 0 7 10 17 17 17 17 17 3 0 7 10 17 17 17 25 32 4 0 7 10 17 17 24 31 ? i
  • 39. Problema da mochila 0-1 39 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p f(3, 2) + v4 = 10 + 24 = 34 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 1 0 0 10 10 10 10 10 10 2 0 7 10 17 17 17 17 17 3 0 7 10 17 17 17 25 32 4 0 7 10 17 17 24 31 ? i
  • 40. Problema da mochila 0-1 40 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p f(3, 7) = 32 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 1 0 0 10 10 10 10 10 10 2 0 7 10 17 17 17 17 17 3 0 7 10 17 17 17 25 32 4 0 7 10 17 17 24 31 ? i
  • 41. Problema da mochila 0-1 41 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p max( f(3, 2) + 24 ; f(3, 7) ) = max(34, 32) = 34 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 1 0 0 10 10 10 10 10 10 2 0 7 10 17 17 17 17 17 3 0 7 10 17 17 17 25 32 4 0 7 10 17 17 24 31 ? i
  • 42. Problema da mochila 0-1 42 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p 34 é o valor máximo! 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 1 0 0 10 10 10 10 10 10 2 0 7 10 17 17 17 17 17 3 0 7 10 17 17 17 25 32 4 0 7 10 17 17 24 31 34 i
  • 43. Problema da mochila 0-1 43 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p Qual a composição? Guarde os apontadores  0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 1 0 0 10 10 10 10 10 10 2 0 7 10 17 17 17 17 17 3 0 7 10 17 17 17 25 32 4 0 7 10 17 17 24 31 34 i
  • 44. Problema da mochila 0-1 44 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p De onde o 34 veio? Do f(3, 2), então o X4 faz parte da solução. 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 1 0 0 10 10 10 10 10 10 2 0 7 10 17 17 17 17 17 3 0 7 10 17 17 17 25 32 4 0 7 10 17 17 24 31 34 i
  • 45. Problema da mochila 0-1 45 P: 7 X1 X2 X3 X4 Vi 10 7 25 24 Pi 2 1 6 5 f(i, p) = f(i – 1, p) se pi > p f(i, p) = max{ f(i – 1, p – pi) + vi, f(i – 1, p) } se pi <= p De onde veio f(1, 2) ? Veio do f(0, 0) + 10, então o X1 faz parte da solução. 0 1 2 3 4 5 6 7 P 0 0 0 0 0 0 0 0 0 1 0 0 10 10 10 10 10 10 2 0 7 10 17 17 17 17 17 3 0 7 10 17 17 17 25 32 4 0 7 10 17 17 24 31 34 i
  • 46. Problema da mochila 0-1 • Complexidade: O(n * P) • “n” é a quantidade de itens. • “P” é a capacidade máxima da mochila. • Depende do “P”, portanto, é pseudo-polinomial.
  • 47. Problema da mochila 0-1 • Implementação em C++: • https://goo.gl/87o8U9 • Vídeo-aula: • https://goo.gl/9syeQP • Dúvidas? • mcastrosouza@live.com