\documentclass[10pt]{article} \usepackage[utf8]{inputenc} \usepackage{amsmath,amsthm,amssymb} \usepackage{fullpage} \usepackage{url} \pagenumbering{gobble} \usepackage{hyperref} \title{ Tutorial: Barras e Barras} \author{} \date{} \begin{document} \maketitle \section{Solução do Problema} O problema do corte de barras (\textit{Rod Cutting}) pode ser resolvido de forma eficiente por meio de \textbf{programação dinâmica}. A ideia é decompor o problema em subproblemas menores: para cada comprimento \(L\) queremos saber qual é a melhor receita máxima que podemos obter cortando (ou não cortando) uma barra de comprimento \(L\). \subsection{Definição do Subproblema} Seja \(p[1 \dots n]\) o vetor de preços onde \(p[i]\) é o preço de vender um pedaço de comprimento \(i\). Definimos: \[ dp[L] = \text{o maior receita obtida cortando uma barra de comprimento } L. \] Assim, \(dp[L]\) representa a resposta ótima para uma barra de tamanho \(L\). \subsection{Função de Transição} Para determinar \(dp[L]\) consideramos a primeira peça que retiramos da barra: se escolhemos cortar uma peça de tamanho \(x\) (com \(1 \le x \le L\)), obtemos imediatamente o preço \(p[x]\) e ficamos com o subproblema da barra restante de tamanho \(L-x\), cujo melhor valor é \(dp[L-x]\). Logo: \[ dp[L] = \max_{1 \le x \le L} \big( p[x] + dp[L-x] \big). \] Em particular, se não fizermos cortes (i.e., vendermos a barra inteira), isso corresponde ao caso \(x=L\) e é coberto pela fórmula acima. \subsection{Casos Base} O caso base é natural: \[ dp[0] = 0, \] isto é, uma barra de comprimento zero tem receita zero. \subsection{Recuperação da Decomposição (pedaços)} Para além do valor máximo \(dp[n]\), frequentemente queremos também uma decomposição concreta (lista de comprimentos dos pedaços) que atinja esse valor. Para isso mantemos, durante a computação de \(dp\), um vetor auxiliar \texttt{cut[L]} que armazena o tamanho \(x\) do primeiro pedaço que produz o ótimo para \(dp[L]\). Após preencher \(dp\) e \texttt{cut}, reconstruímos os pedaços repetindo a operação: tomar \(x=\texttt{cut}[L]\), imprimir \(x\), e reduzir \(L \leftarrow L - x\), até \(L=0\). \end{document}