Programação dinâmica (Dynamic Programming).
Trocar trabalho repetido por estados explícitos e transições verificáveis.
O que já calculamos pode responder a uma decisão nova?
inicializar o estado
reutilize a evidência.
Antes de considerar itens, a capacidade vazia tem valor zero. Esse caso base ancora as próximas transições.
princípio /
Subestrutura ótima e subproblemas sobrepostos permitem guardar respostas parciais e reutilizá-las.
limite que não pode ser omitido
Programação dinâmica não é apenas usar uma tabela. É necessário definir um estado que represente o problema e uma transição que preserve a resposta correta.
Aqui, n é o número de itens e C representa a capacidade discreta da mochila visualizada.
Uma memória, um estado.
O destaque acompanha a decisão atual. Leia o pseudocódigo antes de trocar de linguagem; a implementação é uma tradução, não um novo algoritmo.
01const table = Array(capacity + 1).fill(0);02for (const item of items) {03 for (let limit = capacity; limit >= item.weight; limit--) {04 table[limit] = Math.max(table[limit],05 table[limit - item.weight] + item.value06 );07 }08}