\documentclass[a4paper]{article}
\usepackage{amsmath, amssymb, amsfonts}
\usepackage[italian]{babel}
\usepackage[utf8]{inputenc}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage[a4paper, total={6in, 8in}]{geometry}
\usepackage{minted}
\usepackage{mathpazo}
\usepackage{fancyhdr}
\usepackage{amsthm}
\usepackage{tikz}
\usetikzlibrary{automata,positioning}

% Definizione degli ambienti
\newtheorem{theorem}{Teorema}
\newtheorem{definition}{Definizione}
\newtheorem{example}{Esempio}
\newtheorem{lemma}{Lemma}
\newtheorem{proposition}{Proposizione}

\hypersetup{
    pdftitle={Lezione di Informatica Teorica: NP-Completezza},
    pdfauthor={Appunti da Trascrizione AI}
}

\pagestyle{fancy}
\fancyhf{}
\fancyhead[L]{\textit{Lezione di Informatica Teorica}}
\fancyfoot[C]{\thepage}

\title{Lezione di Informatica Teorica: NP-Completezza \\ Exact Cover e Knapsack}
\author{Appunti da Trascrizione Automatica}
\date{24 Aprile 2024}

\begin{document}
\maketitle
\tableofcontents
\newpage

\section{Introduzione alle Classi di Complessità}

Questa lezione conclude l'introduzione esplicita alla classe NP, prima di esplorare altre classi di complessità come la complessità spaziale e le classi di funzioni (problemi di calcolo piuttosto che di decisione). Verrà inoltre dimostrato il Teorema di Cook nella prossima lezione, che stabilisce che SAT è NP-completo.

\subsection{Definizioni Fondamentali}

\begin{definition}[Problema NP-Completo]
Un problema di decisione $L$ è NP-completo se:
\begin{enumerate}
    \item $L \in \text{NP}$ (appartiene alla classe NP).
    \item $L$ è NP-hard (almeno "duro" quanto tutti i problemi in NP), ovvero ogni problema $L' \in \text{NP}$ è riducibile a $L$ in tempo polinomiale ($L' \le_P L$).
\end{enumerate}
\end{definition}

\begin{definition}[Problema NP-Hard]
Un problema $L$ è NP-hard se ogni problema $L' \in \text{NP}$ è riducibile a $L$ in tempo polinomiale ($L' \le_P L$).
\end{definition}

È importante sottolineare che le classi P e NP, e i concetti di NP-hard e NP-completo, si applicano esclusivamente ai \textbf{problemi di decisione}.

\begin{example}
\textbf{Problema di Somma:}
\begin{itemize}
    \item \textbf{Problema di calcolo:} "Sommare due numeri". Questo non è un problema di decisione e quindi non rientra nelle classi P o NP.
    \item \textbf{Problema di decisione:} "Dati tre numeri $a, b, c$, è vero che $c = a+b$?" Questo è un problema di decisione e, poiché risolvibile in tempo polinomiale, rientra nella classe P.
\end{itemize}
\end{example}

Oggi analizzeremo due problemi NP-completi: \emph{Exact Cover} e \emph{Knapsack}.

\section{Exact Cover}

\begin{definition}[Exact Cover]
\textbf{Input:}
Una coppia $(U, F)$ dove:
\begin{itemize}
    \item $U = \{u_1, u_2, \ldots, u_N\}$ è un insieme finito di oggetti, chiamato \emph{universo}.
    \item $F = \{S_1, S_2, \ldots, S_M\}$ è una famiglia di sottoinsiemi di $U$, ovvero $S_j \subseteq U$ per ogni $j \in \{1, \ldots, M\}$.
\end{itemize}
\textbf{Domanda:} Esiste un sottoinsieme $F' \subseteq F$ tale che gli insiemi in $F'$ formano una \emph{partizione} di $U$?
Una partizione di $U$ significa che gli insiemi in $F'$ sono a due a due disgiunti (cioè $S_a \cap S_b = \emptyset$ per ogni $S_a, S_b \in F', a \neq b$) e la loro unione è uguale a $U$ (cioè $\bigcup_{S \in F'} S = U$).
\end{definition}

\subsection{Membership in NP}
Exact Cover è in NP. Per dimostrarlo, è sufficiente mostrare che data un'istanza YES, possiamo verificare la soluzione in tempo polinomiale.
\begin{itemize}
    \item \textbf{Guess (Indovina):} Un certificato per un'istanza YES di Exact Cover è il sottoinsieme $F' \subseteq F$ che si afferma essere la partizione.
    \item \textbf{Check (Verifica):} Data $F'$, possiamo verificare in tempo polinomiale se:
        \begin{enumerate}
            \item Tutti gli insiemi in $F'$ sono a due a due disgiunti.
            \item L'unione di tutti gli insiemi in $F'$ è uguale all'universo $U$.
        \end{enumerate}
    Queste verifiche possono essere eseguite in tempo polinomiale rispetto alla dimensione dell'input.
\end{itemize}

\subsection{Hardness (Riduzione da 3-SAT)}
Dimostriamo che Exact Cover è NP-hard riducendolo da 3-SAT (che sappiamo essere NP-completo).
Sia $\phi$ un'istanza di 3-SAT. $\phi$ è una formula booleana in forma normale congiuntiva (CNF), composta da $L$ clausole $C_1, \ldots, C_L$, dove ogni clausola $C_j$ contiene esattamente 3 letterali: $C_j = (\lambda_{j,1} \lor \lambda_{j,2} \lor \lambda_{j,3})$. Sia $N$ il numero di variabili in $\phi$.
Dobbiamo costruire una funzione polinomiale $f$ che trasforma $\phi$ in un'istanza $(U_\phi, F_\phi)$ di Exact Cover tale che $\phi$ è soddisfacibile se e solo se $(U_\phi, F_\phi)$ è un'istanza YES di Exact Cover.

\subsubsection{Costruzione dell'Istanza $(U_\phi, F_\phi)$}
\paragraph{1. Universo $U_\phi$:}
L'universo $U_\phi$ è costruito per rappresentare le variabili, le clausole e i letterali della formula $\phi$.
$U_\phi = \{\text{var}_1, \ldots, \text{var}_N\} \cup \{c_1, \ldots, c_L\} \cup \{l_{j,k} \mid j \in [1, L], k \in [1, 3]\}$
\begin{itemize}
    \item $\text{var}_i$: Un oggetto per ogni variabile $x_i$ in $\phi$.
    \item $c_j$: Un oggetto per ogni clausola $C_j$ in $\phi$.
    \item $l_{j,k}$: Un oggetto per ogni letterale $\lambda_{j,k}$ in $\phi$.
\end{itemize}

\paragraph{2. Famiglia di Sottoinsiemi $F_\phi$:}
La famiglia $F_\phi$ contiene diversi tipi di insiemi, progettati per simulare l'assegnazione di verità e la soddisfazione delle clausole.
\begin{enumerate}
    \item \textbf{Insiemi di assegnamento variabile (Type 1):} Per ogni variabile $x_i$ ($i \in [1, N]$), creiamo due insiemi:
    \begin{itemize}
        \item $T_i^{true} = \{\text{var}_i\} \cup \{l_{j,k} \mid \text{il letterale } \lambda_{j,k} \text{ è } \neg x_i\}$
        (Questo insieme "copre" l'oggetto $\text{var}_i$ e tutti gli oggetti $l_{j,k}$ corrispondenti a letterali che diventerebbero falsi se $x_i$ fosse assegnata a TRUE).
        \item $T_i^{false} = \{\text{var}_i\} \cup \{l_{j,k} \mid \text{il letterale } \lambda_{j,k} \text{ è } x_i\}$
        (Questo insieme "copre" l'oggetto $\text{var}_i$ e tutti gli oggetti $l_{j,k}$ corrispondenti a letterali che diventerebbero falsi se $x_i$ fosse assegnata a FALSE).
    \end{itemize}
    \item \textbf{Insiemi di soddisfazione clausola (Type 2):} Per ogni clausola $C_j = (\lambda_{j,1} \lor \lambda_{j,2} \lor \lambda_{j,3})$ ($j \in [1, L]$), creiamo tre insiemi:
    \begin{itemize}
        \item $S_{j,1} = \{c_j, l_{j,1}\}$
        \item $S_{j,2} = \{c_j, l_{j,2}\}$
        \item $S_{j,3} = \{c_j, l_{j,3}\}$
    \end{itemize}
    (Questi insiemi rappresentano la soddisfazione della clausola $C_j$ tramite uno dei suoi letterali. Un solo insieme di questo tipo può essere scelto per ogni $c_j$ nella partizione).
    \item \textbf{Insiemi di pulizia letterale (Type 3):} Per ogni oggetto letterale $l_{j,k}$ in $U_\phi$, creiamo un insieme singleton:
    \begin{itemize}
        \item $\{l_{j,k}\}$
    \end{itemize}
    (Questi insiemi sono usati per "raccogliere le briciole", cioè per coprire gli oggetti $l_{j,k}$ che non sono stati coperti dagli insiemi di Tipo 1 o Tipo 2 selezionati per la partizione. Sono usati come elementi di "riserva").
\end{enumerate}

\begin{example}[Costruzione di $(U_\phi, F_\phi)$]
Sia $\phi = (x_1 \lor \neg x_2 \lor x_3) \land (\neg x_1 \lor x_2 \lor x_4)$.
Qui $N=4$ (variabili $x_1, \ldots, x_4$) e $L=2$ (clausole $C_1, C_2$).

\textbf{Universo $U_\phi$:}
\begin{itemize}
    \item Variabili: $\{\text{var}_1, \text{var}_2, \text{var}_3, \text{var}_4\}$
    \item Clausole: $\{c_1, c_2\}$
    \item Letterali: $\{l_{1,1}, l_{1,2}, l_{1,3}, l_{2,1}, l_{2,2}, l_{2,3}\}$ (corrispondenti a $x_1, \neg x_2, x_3$ per $C_1$ e $\neg x_1, x_2, x_4$ per $C_2$).
\end{itemize}
Quindi, $U_\phi = \{\text{var}_1, \text{var}_2, \text{var}_3, \text{var}_4, c_1, c_2, l_{1,1}, l_{1,2}, l_{1,3}, l_{2,1}, l_{2,2}, l_{2,3}\}$.

\textbf{Famiglia $F_\phi$:}
\begin{itemize}
    \item \textbf{Tipo 1 (assegnamento variabile):}
    \begin{itemize}
        \item $T_1^{true} = \{\text{var}_1\} \cup \{l_{2,1} \text{ (per } \neg x_1 \text{ in } C_2)\}$
        \item $T_1^{false} = \{\text{var}_1\} \cup \{l_{1,1} \text{ (per } x_1 \text{ in } C_1)\}$
        \item $T_2^{true} = \{\text{var}_2\} \cup \{l_{1,2} \text{ (per } \neg x_2 \text{ in } C_1)\}$
        \item $T_2^{false} = \{\text{var}_2\} \cup \{l_{2,2} \text{ (per } x_2 \text{ in } C_2)\}$
        \item $T_3^{true} = \{\text{var}_3\} \cup \emptyset$
        \item $T_3^{false} = \{\text{var}_3\} \cup \{l_{1,3} \text{ (per } x_3 \text{ in } C_1)\}$
        \item $T_4^{true} = \{\text{var}_4\} \cup \emptyset$
        \item $T_4^{false} = \{\text{var}_4\} \cup \{l_{2,3} \text{ (per } x_4 \text{ in } C_2)\}$
    \end{itemize}
    \item \textbf{Tipo 2 (soddisfazione clausola):}
    \begin{itemize}
        \item $S_{1,1} = \{c_1, l_{1,1}\}$
        \item $S_{1,2} = \{c_1, l_{1,2}\}$
        \item $S_{1,3} = \{c_1, l_{1,3}\}$
        \item $S_{2,1} = \{c_2, l_{2,1}\}$
        \item $S_{2,2} = \{c_2, l_{2,2}\}$
        \item $S_{2,3} = \{c_2, l_{2,3}\}$
    \end{itemize}
    \item \textbf{Tipo 3 (pulizia letterale):}
    \begin{itemize}
        \item $\{l_{1,1}\}, \{l_{1,2}\}, \{l_{1,3}\}, \{l_{2,1}\}, \{l_{2,2}\}, \{l_{2,3}\}$
    \end{itemize}
\end{itemize}
\end{example}

\subsubsection{Dimostrazione dell'Equivalenza}

\begin{theorem}
La formula $\phi$ è soddisfacibile se e solo se l'istanza di Exact Cover $(U_\phi, F_\phi)$ ha una partizione.
\end{theorem}
\begin{proof}
\textbf{Parte 1: Se $\phi$ è soddisfacibile $\implies (U_\phi, F_\phi)$ ha una partizione.}
Supponiamo che $\phi$ sia soddisfacibile. Allora esiste un assegnamento di verità $\sigma: \{x_1, \ldots, x_N\} \to \{\text{TRUE}, \text{FALSE}\}$ tale che $\phi$ è TRUE. Costruiamo una partizione $P \subseteq F_\phi$ come segue:
\begin{enumerate}
    \item Per ogni variabile $x_i$:
    \begin{itemize}
        \item Se $\sigma(x_i) = \text{TRUE}$, includiamo $T_i^{true}$ in $P$.
        \item Se $\sigma(x_i) = \text{FALSE}$, includiamo $T_i^{false}$ in $P$.
    \end{itemize}
    Questi insiemi coprono tutti gli oggetti $\text{var}_i$ esattamente una volta. Inoltre, coprono alcuni oggetti $l_{j,k}$ (quelli che vengono falsificati dall'assegnamento $\sigma$).
    \item Per ogni clausola $C_j$:
    Poiché $\phi$ è soddisfacibile, $C_j$ è soddisfatta da $\sigma$. Ciò significa che almeno uno dei letterali in $C_j$ è TRUE sotto $\sigma$. Scegliamo esattamente uno di questi letterali $\lambda_{j,k'}$ che rende $C_j$ vera, e includiamo l'insieme $S_{j,k'} = \{c_j, l_{j,k'}\}$ in $P$.
    Questi insiemi coprono tutti gli oggetti $c_j$ esattamente una volta. Essi coprono anche un oggetto $l_{j,k'}$ per ogni clausola. Questi $l_{j,k'}$ sono oggetti che corrispondono a letterali veri sotto $\sigma$, e quindi non sono stati coperti dagli insiemi di Tipo 1.
    \item Per tutti gli oggetti $l_{j,k}$ rimanenti (quelli non coperti dagli insiemi di Tipo 1 o Tipo 2), includiamo il loro singleton $\{l_{j,k}\}$ in $P$.
\end{enumerate}
Verifichiamo che $P$ è una partizione:
\begin{itemize}
    \item \textbf{Disgiunzione:}
    \begin{itemize}
        \item Gli insiemi di Tipo 1 (assegnamento variabile) sono disgiunti tra loro per lo stesso $\text{var}_i$ perché solo uno $T_i^{true}$ o $T_i^{false}$ è scelto. Per $\text{var}_i \ne \text{var}_k$, essi non condividono $\text{var}$ oggetti. Possono condividere oggetti $l_{j,k}$, ma non è un problema per la disgiunzione complessiva perché l'insieme selezionato sarà un sottoinsieme della partizione finale.
        \item Gli insiemi di Tipo 2 (soddisfazione clausola) sono disgiunti tra loro per la stessa $c_j$ perché solo uno $S_{j,k'}$ è scelto. Per $c_j \ne c_k$, non condividono $c$ oggetti. Possono condividere $l$ oggetti, ma questo è gestito dal processo di selezione e dalla gestione dei singleton.
        \item Gli insiemi di Tipo 1 e Tipo 2 non condividono oggetti $\text{var}_i$ o $c_j$. Possono condividere oggetti $l_{j,k}$. Per costruzione, gli $l_{j,k}$ in $T_i^{true}$ o $T_i^{false}$ sono quelli corrispondenti a letterali falsi sotto $\sigma$. Gli $l_{j,k'}$ in $S_{j,k'}$ sono quelli corrispondenti a letterali veri sotto $\sigma$. Dunque, un oggetto $l_{j,k}$ non può essere presente sia in un $T_i$ selezionato che in un $S_j$ selezionato.
        \item I singleton $\{l_{j,k}\}$ sono usati solo per coprire gli $l_{j,k}$ che non sono stati inclusi in nessun $T_i$ o $S_j$ selezionato.
    \end{itemize}
    \item \textbf{Unione:}
    \begin{itemize}
        \item Gli oggetti $\text{var}_i$ sono coperti esattamente una volta da $T_i^{true}$ o $T_i^{false}$.
        \item Gli oggetti $c_j$ sono coperti esattamente una volta da $S_{j,k'}$ (uno per clausola).
        \item Gli oggetti $l_{j,k}$ sono coperti: se falsificati da $\sigma$, sono inclusi in un $T_i$ selezionato; se rendono vera una clausola $C_j$ e vengono scelti per la partizione, sono inclusi in un $S_{j,k'}$ selezionato; altrimenti, sono coperti dal loro singleton $\{l_{j,k}\}$. Poiché ogni $l_{j,k}$ è o falsificato o vero (e se vero, può essere scelto per una clausola), tutti gli $l_{j,k}$ sono coperti.
    \end{itemize}
    Pertanto, $P$ è una partizione di $U_\phi$.

\textbf{Parte 2: Se $(U_\phi, F_\phi)$ ha una partizione $\implies \phi$ è soddisfacibile.}
Supponiamo che esista una partizione $P \subseteq F_\phi$ di $U_\phi$. Definiamo un assegnamento di verità $\sigma$ per le variabili di $\phi$:
Per ogni variabile $x_i$:
\begin{itemize}
    \item Se $T_i^{true} \in P$, allora $\sigma(x_i) = \text{TRUE}$.
    \item Se $T_i^{false} \in P$, allora $\sigma(x_i) = \text{FALSE}$.
\end{itemize}
\textbf{Verifica di $\sigma$:}
\begin{itemize}
    \item \textbf{Ogni variabile ha un assegnamento:} Ogni oggetto $\text{var}_i \in U_\phi$ deve essere coperto da un insieme in $P$. L'unico modo per coprire $\text{var}_i$ è includere o $T_i^{true}$ o $T_i^{false}$ in $P$. Poiché $P$ è una partizione, non possono essere entrambi in $P$ (condividerebbero $\text{var}_i$), quindi esattamente uno è in $P$. Ciò assicura che $\sigma$ assegna un valore a ogni variabile.
    \item \textbf{Assegnamento consistente:} Poiché solo uno tra $T_i^{true}$ e $T_i^{false}$ può essere in $P$, $\sigma$ non assegna contemporaneamente TRUE e FALSE a nessuna variabile.
\end{itemize}
\textbf{Soddisfazione di $\phi$:}
Per dimostrare che $\sigma$ soddisfa $\phi$, dobbiamo mostrare che ogni clausola $C_j$ è TRUE sotto $\sigma$.
Per ogni oggetto $c_j \in U_\phi$, esso deve essere coperto da un insieme in $P$. Gli unici insiemi in $F_\phi$ che contengono $c_j$ sono $S_{j,1}, S_{j,2}, S_{j,3}$. Dunque, esattamente uno di questi insiemi, diciamo $S_{j,k'} = \{c_j, l_{j,k'}\}$, deve essere in $P$.
Questo significa che il letterale $\lambda_{j,k'}$ corrispondente a $l_{j,k'}$ deve essere TRUE sotto l'assegnamento $\sigma$. Se $\lambda_{j,k'}$ fosse FALSE sotto $\sigma$, allora l'oggetto $l_{j,k'}$ sarebbe incluso in uno degli insiemi $T_i^{true}$ o $T_i^{false}$ selezionati (poiché $l_{j,k'}$ è falsificato). Ma se $l_{j,k'}$ fosse in un $T_i$ selezionato e anche in $S_{j,k'}$ (che è in $P$), ci sarebbe un'intersezione tra $T_i$ e $S_{j,k'}$, violando la proprietà di disgiunzione di una partizione.
Pertanto, $\lambda_{j,k'}$ deve essere TRUE sotto $\sigma$, il che significa che la clausola $C_j$ è soddisfatta. Poiché questo vale per ogni $C_j$, $\phi$ è soddisfacibile.
\end{proof}

Conclusione: Exact Cover è NP-completo.

\section{Knapsack (Problema della Bisaccia)}

\subsection{Definizione dell'ottimizzazione e della decisione}

\begin{definition}[Knapsack (Versione Ottimizzazione)]
\textbf{Input:}
Un insieme di $N$ oggetti, per ognuno dei quali:
\begin{itemize}
    \item $w_i$: un peso associato.
    \item $v_i$: un valore associato.
\end{itemize}
Una capacità massima $W$ (peso della bisaccia).
\textbf{Domanda:} Trovare un sottoinsieme di oggetti $S \subseteq \{1, \ldots, N\}$ tale che la somma dei pesi degli oggetti in $S$ non superi $W$ ($\sum_{i \in S} w_i \le W$) e la somma dei valori degli oggetti in $S$ sia massimizzata ($\sum_{i \in S} v_i$ sia massima).
\end{definition}

La versione di ottimizzazione di Knapsack non è direttamente in NP, poiché NP è una classe di problemi di decisione. Per studiarlo nella teoria della complessità, usiamo la versione di decisione:

\begin{definition}[Knapsack (Versione Decisione)]
\textbf{Input:}
Un insieme di $N$ oggetti, per ognuno dei quali:
\begin{itemize}
    \item $w_i$: un peso associato.
    \item $v_i$: un valore associato.
\end{itemize}
Una capacità massima $W$ (peso della bisaccia) e un valore soglia $K$.
\textbf{Domanda:} Esiste un sottoinsieme di oggetti $S \subseteq \{1, \ldots, N\}$ tale che la somma dei pesi degli oggetti in $S$ non superi $W$ ($\sum_{i \in S} w_i \le W$) e la somma dei valori degli oggetti in $S$ sia almeno $K$ ($\sum_{i \in S} v_i \ge K$)?
\end{definition}

\subsection{Membership in NP (Versione Decisione)}
Knapsack (versione decisione) è in NP.
\begin{itemize}
    \item \textbf{Guess (Indovina):} Un certificato per un'istanza YES di Knapsack è il sottoinsieme $S \subseteq \{1, \ldots, N\}$ degli oggetti scelti.
    \item \textbf{Check (Verifica):} Dati $S$, possiamo verificare in tempo polinomiale se:
        \begin{enumerate}
            \item La somma dei pesi $\sum_{i \in S} w_i \le W$.
            \item La somma dei valori $\sum_{i \in S} v_i \ge K$.
        \end{enumerate}
    Queste verifiche sono semplici sommatorie e confronti, eseguibili in tempo polinomiale.
\end{itemize}

\subsection{Hardness (Riduzione da Exact Cover)}
Dimostriamo che Knapsack (decisione) è NP-hard riducendolo da Exact Cover.
Sia $(U, F)$ un'istanza di Exact Cover, con $U = \{u_1, \ldots, u_N\}$ e $F = \{S_1, \ldots, S_M\}$.
Dobbiamo costruire una funzione polinomiale $f$ che trasforma $(U, F)$ in un'istanza di Knapsack (oggetti, pesi $w_i$, valori $v_i$, capacità $W$, soglia $K$) tale che $(U, F)$ è un'istanza YES di Exact Cover se e solo se l'istanza di Knapsack generata è un'istanza YES.

\subsubsection{Costruzione dell'Istanza di Knapsack}
La riduzione sfrutta una particolare forma dell'istanza di Knapsack.
\paragraph{1. Assunzione Specifiche:}
Costruiremo un'istanza di Knapsack in cui:
\begin{itemize}
    \item I valori sono uguali ai pesi: $v_i = w_i$ per ogni oggetto $i$.
    \item La soglia $K$ è uguale alla capacità $W$: $K = W$.
\end{itemize}
Con queste assunzioni, il problema di decisione del Knapsack diventa: "Esiste un sottoinsieme di oggetti $S$ tale che $\sum_{i \in S} w_i = W$?" (poiché $\sum w_i \le W$ e $\sum v_i \ge K$ con $v_i=w_i$ e $K=W$ implica $\sum w_i \ge W$, quindi uguaglianza).

\paragraph{2. Oggetti della Bisaccia:}
Ci sono $M$ oggetti nella bisaccia, uno per ogni insieme $S_j \in F$.

\paragraph{3. Pesi ($w_j$) e Valori ($v_j$):}
Per ogni oggetto $j$ (corrispondente al set $S_j \in F$), definiamo il suo peso $w_j$ (e valore $v_j=w_j$) in modo che codifichi la composizione del set $S_j$.
Per evitare i problemi di "riporto" che si avrebbero con la rappresentazione binaria standard, useremo una base numerica sufficientemente grande, in particolare $M+1$ (dove $M$ è il numero totale di insiemi in $F$). Questo assicura che la somma di $M$ cifre 0 o 1 in qualsiasi posizione non genererà un riporto.

Il peso $w_j$ (e valore $v_j$) per l'oggetto $j$ (che rappresenta l'insieme $S_j \in F$) è definito come:
\[ w_j = \sum_{k=1}^N \delta_{j,k} \cdot (M+1)^{N-k} \]
dove:
\begin{itemize}
    \item $N$ è il numero di elementi nell'universo $U$.
    \item $M$ è il numero di insiemi nella famiglia $F$.
    \item $\delta_{j,k} = 1$ se l'elemento $u_k \in U$ è contenuto nell'insieme $S_j$ (cioè $u_k \in S_j$).
    \item $\delta_{j,k} = 0$ se l'elemento $u_k \in U$ non è contenuto nell'insieme $S_j$ (cioè $u_k \notin S_j$).
\end{itemize}
Questa formula interpreta $w_j$ come un numero in base $(M+1)$, dove la $k$-esima cifra (da sinistra, corrispondente a $u_k$) è 1 se $u_k \in S_j$ e 0 altrimenti.

\paragraph{4. Capacità $W$ e Soglia $K$:}
La capacità della bisaccia $W$ (e la soglia $K$) è definita come il numero la cui rappresentazione in base $(M+1)$ è composta da tutti '1'. Questo significa che ogni elemento dell'universo deve essere coperto esattamente una volta.
\[ W = K = \sum_{k=1}^N 1 \cdot (M+1)^{N-k} \]

\begin{example}[Knapsack Reduction (Base $M+1$)]
Sia $U = \{u_1, u_2, u_3, u_4\}$ ($N=4$) e $F = \{S_1, S_2, S_3\}$ ($M=3$).
\begin{itemize}
    \item $S_1 = \{u_3, u_4\}$
    \item $S_2 = \{u_2, u_4\}$
    \item $S_3 = \{u_2, u_3, u_4\}$
\end{itemize}
La base sarà $M+1 = 3+1 = 4$.
I pesi $w_j$ (e valori $v_j$) sono:
\begin{itemize}
    \item $w_1 = (0011)_4 = 0 \cdot 4^3 + 0 \cdot 4^2 + 1 \cdot 4^1 + 1 \cdot 4^0 = 4+1 = 5$
    \item $w_2 = (0101)_4 = 0 \cdot 4^3 + 1 \cdot 4^2 + 0 \cdot 4^1 + 1 \cdot 4^0 = 16+1 = 17$
    \item $w_3 = (0111)_4 = 0 \cdot 4^3 + 1 \cdot 4^2 + 1 \cdot 4^1 + 1 \cdot 4^0 = 16+4+1 = 21$
\end{itemize}
La capacità e soglia $W=K$ sono:
\begin{itemize}
    \item $W = K = (1111)_4 = 1 \cdot 4^3 + 1 \cdot 4^2 + 1 \cdot 4^1 + 1 \cdot 4^0 = 64+16+4+1 = 85$
\end{itemize}
In questo esempio, l'istanza di Exact Cover è NO (l'elemento $u_1$ non è coperto da nessun set in $F$). Se la riduzione funziona correttamente, l'istanza di Knapsack generata dovrebbe essere anch'essa NO (non dovrebbe essere possibile sommare $w_j$ a 85).
\end{example}

\subsubsection{Dimostrazione dell'Equivalenza}

\begin{theorem}
L'istanza di Exact Cover $(U, F)$ ha una partizione se e solo se l'istanza di Knapsack costruita ha una soluzione con peso totale $W$ e valore totale $K$.
\end{theorem}
\begin{proof}
Ricordiamo che, per costruzione, il problema Knapsack si riduce a trovare un sottoinsieme di pesi che sommi esattamente a $W$, poiché $v_j=w_j$ e $K=W$.

\textbf{Parte 1: Se $(U, F)$ ha una partizione $\implies$ l'istanza di Knapsack ha una soluzione.}
Supponiamo che esista un sottoinsieme $F' \subseteq F$ tale che $F'$ è una partizione di $U$. Questo significa che:
\begin{enumerate}
    \item Gli insiemi in $F'$ sono a due a due disgiunti: $S_a \cap S_b = \emptyset$ per ogni $S_a, S_b \in F', a \neq b$.
    \item La loro unione è $U$: $\bigcup_{S \in F'} S = U$.
\end{enumerate}
Consideriamo il sottoinsieme di oggetti Knapsack corrispondente agli insiemi in $F'$. Siano questi oggetti $S'_{items} = \{j \mid S_j \in F'\}$.
Calcoliamo la somma dei pesi di questi oggetti: $\sum_{j \in S'_{items}} w_j$.
Per la definizione di $w_j$ e le proprietà di $F'$:
\[ \sum_{j \in S'_{items}} w_j = \sum_{j \in S'_{items}} \left( \sum_{k=1}^N \delta_{j,k} \cdot (M+1)^{N-k} \right) \]
Invertendo l'ordine delle sommatorie:
\[ \sum_{k=1}^N \left( \sum_{j \in S'_{items}} \delta_{j,k} \right) \cdot (M+1)^{N-k} \]
Poiché $F'$ è una partizione di $U$:
\begin{itemize}
    \item Ogni elemento $u_k \in U$ appartiene a \emph{esattamente uno} degli insiemi in $F'$. Questo significa che per ogni $k \in \{1, \ldots, N\}$, la somma $\sum_{j \in S'_{items}} \delta_{j,k}$ sarà esattamente 1. (Non può essere più di 1 perché i set sono disgiunti; non può essere meno di 1 perché la loro unione è $U$).
\end{itemize}
Quindi, la somma dei pesi diventa:
\[ \sum_{k=1}^N 1 \cdot (M+1)^{N-k} \]
Questa è esattamente la definizione di $W$.
\[ \sum_{j \in S'_{items}} w_j = W \]
Poiché per costruzione $v_j=w_j$ e $K=W$, anche $\sum_{j \in S'_{items}} v_j = K$.
Dunque, se $(U, F)$ ha una partizione, l'istanza di Knapsack ha una soluzione.

\textbf{Parte 2: Se l'istanza di Knapsack ha una soluzione $\implies (U, F)$ ha una partizione.}
Supponiamo che esista un sottoinsieme di oggetti Knapsack $S'_{items}$ tale che $\sum_{j \in S'_{items}} w_j = W$.
Consideriamo la somma $\sum_{j \in S'_{items}} w_j$ in base $(M+1)$. Ogni $w_j$ è un numero in base $(M+1)$ le cui cifre sono 0 o 1.
La somma delle cifre in una data posizione $k$ (corrispondente all'elemento $u_k \in U$) è data da $\sum_{j \in S'_{items}} \delta_{j,k}$. Poiché al massimo $M$ numeri sono sommati (corrispondenti agli $M$ insiemi in $F$), e la base è $(M+1)$, non ci saranno mai riporti. Questo è cruciale: la somma di $M$ cifre (0 o 1) in base $(M+1)$ non può generare un riporto. La somma massima possibile per una colonna è $M \times 1 = M$, che è una cifra valida in base $(M+1)$ (da 0 a $M$).
Dato che la somma totale è $W = \sum_{k=1}^N 1 \cdot (M+1)^{N-k}$ (il numero con tutte le cifre 1 in base $M+1$) e non ci sono riporti, questo implica che per ogni posizione $k$, la somma delle cifre in quella posizione deve essere esattamente 1.
\[ \forall k \in \{1, \ldots, N\}, \quad \sum_{j \in S'_{items}} \delta_{j,k} = 1 \]
Questa condizione significa che ogni elemento $u_k \in U$ è contenuto in esattamente uno degli insiemi $S_j$ il cui oggetto corrispondente è stato selezionato per la bisaccia.
Pertanto, gli insiemi $\{S_j \mid j \in S'_{items}\}$ formano una partizione di $U$.
Dunque, se l'istanza di Knapsack ha una soluzione, $(U, F)$ ha una partizione.
\end{proof}

\subsection{Conclusione}
Avendo dimostrato che Knapsack (decisione) è in NP e NP-hard (tramite riduzione da Exact Cover), concludiamo che \textbf{Knapsack è NP-completo}.
Il problema Knapsack può essere formulato come un problema di \textbf{Programmazione Lineare Intera (ILP)}. Poiché Knapsack è NP-completo, e ILP è un problema più generale che include Knapsack come caso speciale, si deduce che la \textbf{Programmazione Lineare Intera è NP-hard}.

\end{document}