Programação dinâmica

Estados, recorrências, ordem de cálculo e reconstrução na mochila, trocos, subconjuntos e subvetor máximo.

TLDR

Perguntar sobre esta página

ChatGPTClaudePerplexityGrokGeminiCopiar e abrirDeepSeekCopiar e abrir

Definir estado antes de preencher

Escreve significado da célula, bases, alternativas e ordem com dependências prontas. Memoização evita inalcançáveis; tabulação explicita ordem. Custo é estados vezes trabalho por estado.

Tabelas essenciais

FF é valor da mochila, CC é número de moedas, BB é existência booleana e EE é melhor soma terminada em ii. O objeto ii tem peso pip_i e valor viv_i; a moeda ii tem valor facial cic_i e stock sis_i. WW é a capacidade da mochila, TT é o alvo de soma ou trocos, S=max⁡siS=\max s_i é o maior stock e qq é a quantidade usada da denominação atual.

ProblemaEstado e transiçãoCusto
Mochila 0-1F[i,w]=max⁡(F[i−1,w],vi+F[i−1,w−pi])F[i,w]=\max(F[i-1,w],v_i+F[i-1,w-p_i]) se pi≤wp_i\le w; senão F[i−1,w]F[i-1,w]O(nW)O(nW)
Trocos ilimitadosC[i,t]=min⁡(C[i−1,t],1+C[i,t−ci])C[i,t]=\min(C[i-1,t],1+C[i,t-c_i]); ignora a segunda se t<cit<c_iO(nT)O(nT)
Trocos com stockmin⁡q(q+C[i−1,t−qci])\min_q(q+C[i-1,t-qc_i]) com 0≤q≤min⁡(si,⌊t/ci⌋)0\le q\le\min(s_i,\lfloor t/c_i\rfloor)O(nT(S+1))O(nT(S+1)) direto
Soma de subconjuntosB[i,t]=B[i−1,t]∨(t≥ai∧B[i−1,t−ai])B[i,t]=B[i-1,t]\lor(t\ge a_i\land B[i-1,t-a_i])O(nT)O(nT)
Subvetor não vazioE[i]=max⁡(A[i],E[i−1]+A[i])E[i]=\max(A[i],E[i-1]+A[i]) com E[0]=A[0]E[0]=A[0]; resposta é o máximo globalO(n)O(n)

Bases: mochila zero; trocos com alvo zero custa zero e alvo positivo sem moedas custa infinito; soma com B[0,0]B[0,0] verdadeiro. Reconstruir exige pais ou decisões; vetor único economiza espaço mas apaga histórico.

Regras que evitam erros

  • Linha anterior impede repetir objeto na 0-1. Percorre ww por ordem decrescente no vetor único; crescente resolveria a ilimitada.
  • Com 1 objeto de peso 2 e valor 3, com W=4W=4, percorrer ww por ordem crescente dá 6 por reutilizar o objeto duas vezes; por ordem decrescente dá 3, o valor correto da mochila 0-1.
  • O(nW)O(nW) e O(nT)O(nT) são pseudopolinomiais com W,TW,T em binário.
  • DAG com destino tt: D[t]=0D[t]=0, D[u]=min⁡u→v(w+D[v])D[u]=\min_{u\to v}(w+D[v]) em ordem inversa; sem caminho mantém infinito.
  • Combinações: (nk)=(n−1k−1)+(n−1k)\binom nk=\binom{n-1}{k-1}+\binom{n-1}k; reduz memória com kk decrescente.

Recorrências e reconstrução.

À tua maneira

Aparência

Modo de cor
Tema
Cor de destaque

Leitura

Fonte de leitura

Álgebra, lógica e uma ideia de cada vez.

Código

Fonte do código

Navegação

Cursor de leitura, sem edição. h, j, k, l movem; / pesquisa nesta página. v seleciona caracteres; V seleciona linhas; y copia. Tab permite destacar ou comentar. Espaço ou Enter abre blocos recolhíveis. Nos cartões, h, j, k, l mudam o foco.

CSS personalizado

Ativa uma sugestão ou guarda o teu CSS. Só muda este navegador.

Usa --page, --text e --accent para acompanhar o tema.

Seletores e recuperação

.site-header, .prose, .course-card, [data-reading-history], [data-playground] e .page-actions.

Abre a aparência com a tecla vírgula ou no rodapé. Se o CSS esconder os controlos, abre esta página sem CSS personalizado.

Pesquisar

Escreve para pesquisar em todo o site.

para escolher · Enter para abrir · Esc para fechar

Copiar fórmula

A cópia automática não está disponível. Copia o LaTeX abaixo.

Pesquisar nesta página

Enter procura · n / N repetem · Esc cancela. Ctrl / Cmd K pesquisa todo o site.

Atalhos de teclado

Clica numa tecla para a mudar. Esc cancela. Backspace desativa.

PesquisarCtrl / Cmd K

Os atalhos não interferem enquanto escreves. Tab e Enter funcionam sempre.