Algoritmi e Strutture Dati Autunno 02 Espressione minima di valore dato Dip. Informatica ed Appl. Prof. G. Persiano Università di Salerno Consideriamo il seguente problema. Riceviamo in input un insieme X di n interi positivi ed un intero target T . Desideriamo calcolare il costo minimo di un’espressione X-legale con valore T . Un’espressione con valore T è X-legale (o semplicemente legale quando l’insieme X è chiaro dal contesto) che contiene solo gli elementi di X (anche ripetuti), addizioni ed al più una moltiplicazione. Ad esempio se X = {2, 4, 5, 11, 21} allora E1 = ((4 + 5) ∗ (2 + 11)) + 4 è un’espressione legale con valore 121. L’espressione E2 = ((4 + 5) ∗ (2 + 11)) ∗ 4 non è invece un’espressione legale in quanto comprende due moltiplicazioni. Ogni addizione costa 1 ed ogni moltiplicazione costa 3. Il costo di un’espressione è semplicemente la somma del costo delle sue operazioni. Ad esempio, E1 costa 6. 1. Indichiamo con S(t) l’insieme di tutte l’espressioni legali con valore t e con C(t) il minimo dei costi delle espressioni in S(t). 2. L’insieme di tutte le espressioni di valore t può essere partizionato in due insiemi: l’insieme S(t, 0) delle espressioni che non contengono moltiplicazioni e l’insieme S(t, 1) delle espressioni che contengono esattamente una moltiplicazione. Denotando con C(t, 0) e C(t, 1) il costo della minima espressione di ciascun insieme, abbiamo che C(t) = min{C(t, 0), C(t, 1)}. 3. In ogni espressione è possibile individuare l’operazione che è eseguita per ultima e questa può essere un’addizione o una moltiplicazione. Pertanto, poniamo le seguenti definizioni: • S(t, 1, ∗) è l’insieme di tutte le espressioni che hanno valore t, contengono una moltiplicazione e l’ultima operazione è una moltiplicazione e denotiamo con C(t, 1, ∗) il costo minimo di un’espressione di questo insieme. • S(t, 1, +) è l’insieme di tutte le espressioni che hanno valore t, contengono una moltiplicazione e l’ultima operazione è una addizione e denotiamo con C(t, 1, +) il costo minimo di un’espressione di questo insieme. • S(t, 0, +) è l’insieme di tutte le espressioni che hanno valore t, non contengono moltiplicazioni e l’ultima operazione è una addizione e denotiamo con C(t, 0, +) il costo minimo di un’espressione di questo insieme. Notiamo ora che S(t, 1) = S(t, 1, ∗) ∪ S(t, 1, +) e quindi C(t, 1) = min{C(t, 1, ∗), C(t, 1, +)}. Inoltre, abbiamo S(t, 0, +) = S(t, 0) e quindi C(t, 0, +) = C(t, 0); 4. Un’espressione E di S(t, 0, +) ha la forma E = E1 + E2 ove E1 ha valore a, con 1 ≤ a ≤ t − 1 e non contiene alcuna moltiplicazione (quindi E1 ∈ S(a, 0)) e E2 ha valore (t − a) e non contiene alcuna moltiplicazione (quindi E2 ∈ S(t − a, 0)). Inoltre osserviamo che se E è l’espressione di costo minimo tra quelle di S(t, 0, +) allora anche E1 ed E2 hanno costo minimo in S(a, 0) e S(t − a, 0), rispettivamente. Possiamo quindi affermare che C(t, 0, +) = min {C(a, 0) + C(t − a, 0) + 1}. 1≤a≤t−1 5. Un’espressione E di S(t, 1, +) ha la forma E = E1 + E2 ove E1 ha valore a, con 1 ≤ a ≤ t − 1 e contiene una moltiplicazione (quindi E1 ∈ S(a, 1)) e E2 ha valore (t − a) e non contiene alcuna moltiplicazione (quindi E2 ∈ S(t − a, 0)). Come al passo precedente osserviamo che se E ha costo minimo anche E1 ed E2 avranno costo minimo (in S(a, 1) e S(t − a, 0), rispettivamente) e quindi deduciamo che C(t, 1, +) = min {C(a, 1) + C(t − a, 0) + 1}. 1≤a≤t−1 Espressione minima di valore dato 2 6. Un’espressione E di S(t, 1, ∗) ha la forma E = E1 ∗ E2 ove E1 ha valore a, con 2 ≤ a ≤ t − 1 e a divisore di t, e non contiene alcuna moltiplicazione (quindi E1 ∈ S(a, 0)) e E2 ha valore (t/a) e non contiene alcuna moltiplicazione (quindi E2 ∈ S(t/a, 0)). Seguendo un ragionamento simile a quello del passo precedente abbiamo C(t, 1, ∗) = min {C(a, 0) + C(t/a, 0) + 3}. a|t 2≤a≤t−1 Abbiamo pertanto il seguente algoritmo MinEspressioneLegale(X, T ) 01. for t = 1 to T 02. if t ∈ X then 03. C(t, 0) = C(t, 1) = 0; 04. else 05. C(t, 1, +) = min1≤a≤t−1 {C(a, 1) + C(t − a, 0) + 1}; 06. C(t, 1, ∗) = min a|t {C(a, 0) + C(t/a, 0) + 3}; 2≤a≤t−1 07. C(t, 1) = min{C(t, 1, +), C(t, 1, ∗)}; 08. C(t, 0) = min1≤a≤t−1 {C(a, 0) + C(t − a, 0) + 1}; 09. end; 10. return min{C(T, 0), C(T, 1)}; Nel calcolo del minimo ai passi 5, 6, 7, 8 assumiamo che il minimo di un insieme vuoto sia +∞. Notiamo che alla t-esima iterazione del ciclo for, l’algoritmo calcola i valori di C(·, ·) e C(·, ·, ·) usando i valori della funziona per valori del primo argomento minori di t che sono stati già calcolati ai passi precedenti. L’algoritmo impiega tempo O(T 2 ) ed è pertanto pseudopolinomiale.