Mochila booleana: programação dinâmica

[Enunciado]  O algoritmo abaixo resolve o problema da mochila booleana.  A tabela t tem o seguinte significado: para cada i entre 0 e n e cada b entre 0 e c,

t[i,b]  é o valor de uma solução ótima da instância (p1,…,pi, v1,…,vi, b) do problema da mochila booleana.

A segunda parte do algoritmo (linhas 9 a 15) extrai de t uma solução X da instância.

  Mochila-Prog-Din (p, v, n, c)
1o para  b ← 0  até  c  faça
1oooo t[0,b] ← 0
1oooo para  i ← 1  até  n  faça
1ooooooo at[i−1,b]
1ooooooo se  pi > b
1oooooooooo então  a′ ← 0
1oooooooooo senão  a′t[i−1,bpi] + vi
1ooooooo t[i,b] ← max(aa′)
1o bc
10  o X ← { }
11  o para  in  decrescendo até  1  faça
12  oooo se  t[i,b] ≠ t[i−1,b]
13  ooooooo então  XX ∪ {i}
14  ooooooo então  bbpi
15  o devolva  X

(Note que a coluna t[∗,0] não é inicializada com zeros. Ela pode conter elementos não nulos se pi = 0 para algum i.)

É óbvio que o consumo de tempo do algoritmo é  Ο(n c)  e também Ω(nc).  Para colocar em foco o efeito de c sobre o consumo de tempo, faça o seguinte experimento mental. Imagine que os números p1, … , pn e c são multiplicados por 100. O algoritmo consumirá 100 vezes mais tempo para resolver a nova instância, embora essa nova instância seja conceitualmente idêntica à original (pois a multiplicação por 100 é apenas uma mudança de escala).

Preenchimento "por linhas"

O bloco de linhas 1 a 8 poderia também ser escrito assim:

1o para  b ← 0  até  c  faça
1oooo t[0,b] ← 0
1o para  i ← 1  até  n  faça
1oooo para  b ← 0  até  c  faça
1ooooooo at[i−1,b]
1ooooooo se  pi > b
1oooooooooo então  a′ ← 0
1oooooooooo senão  a′t[i−1,bpi] + vi
1ooooooo t[i,b] ← max(aa′)

Exercícios

  1. Se tivesse que programar o algoritmo Mochila-Prog-Din pra valer, que comentários você escreveria junto com o código?  [Solução]
  2. Critique o seguinte fragmento de código:
    1o para  i ← 0  até  n  faça
    1oooo t[i,0] ← 0
    1o para  b ← 1  até  c  faça
    1oooo t[0,b] ← 0
    1oooo para  i ← 1  até  n  faça
    1ooooooo at[i−1,b]

Valid HTML 4.01 Strict Valid CSS!