Corso di Laurea in Informatica
Corso di Algoritmi II
Esercitazione – 16 gennaio 2007
1. Composizione dello Zaino
L’algoritmo di programmazione dinamica che risolve il problema ‘zaino’ nella versione di
ottimizzazione non calcola l’insieme J degli oggetti che ottimizzano il contenuto dello zaino,:
function Zaino-0-1 (K, k1, ..., kn, v1, ..., vn, n: integer): integer
ak[1..n]  k1, ..., kn
av[1..n]  v1, ..., vn
for h  0 to n do MP[h,0]  0
for H  0 to K do MP[0,H]  0
for h  1 to n do
for H 1 to K do
if (H-ak[h])  0 and MP[h-1, H] < MP[h-1, H-ak[h]]+av[h])
then MP[h, H]  MP[h-1, H-ak[h]]+av[h]
else MP[h, H]  MP[h-1, H]
return MP[n, K]
Modificare l’algoritmo per ottenere anche l’insieme di indici J tale che {vj | j  J } sia la
soluzione.
Suggerimento: Usare una seconda matrice booleana MQ il cui elemento MQ[h, H] = vero se e
solo se la soluzione trovata per il problema P(h, H), usa l’elemento h-mo
Per trovare l’insieme J basterà “procedere a ritroso” sulla matrice MQ.
function Zaino-0-1 (K, k1, ..., kn, v1, ..., vn, n: integer): integer
ak[1..n]  k1, ..., kn
av[1..n]  v1, ..., vn
for h  0 to n do MP[h,0]  0
for H  0 to K do MP[0,H]  0
for h  1 to n do
for H 1 to K do
if (H-ak[h])  0 and MP[h-1, H] < MP[h-1, H-ak[h]]+av[h])
then MP[h, H]  MP[h-1, H-ak[h]]+av[h]
MQ[h, H]  “true”
else
MP[h, H]  MP[h-1, H]
MQ[h, H]  “false”
return MP[n, K]
Calcolo dell’insieme J, inizialmente vuoto
Calcolo_J (MQ: array nxK, H, h: integer; J: set)
if h = 0 or H = 0 then return
while not MQ[h, H] do
h  h-1
J  J  {h}
Calcolo_J (MQ, H-ak[h], h-1)
return
Calcolo iterativo dell’insieme J
Calcolo_J_iter (MQ: array nxK, H, h: integer)
J
HK
for i  n to 1 do
if MQ[i, H]
then J  J  {i}
H  H-ak[i]
return J
Si può sostituire la matrice MP con due vettori: uno per la riga “precedente” ed uno per la riga
che si sta costruendo (poi alla fine si scambiano i vettori ....), mentre per costruire l’insieme J
serve mantenere tutta la matrice MQ.
Per ognuno dei seguenti problemi:
a) Scrivere la definizione induttiva.
b) Fornire l’algoritmo di programmazione dinamica basato sulla definizione data.
c) Specificare la complessità dell’algoritmo a costi uniformi
2. Torneo
In un torneo si sfidano due squadre: INF e MAT. I due team giocano al più 2n-1 partite, in
quanto vince la squadra che per prima raggiunge n vittorie, supponendo che non vi siano partite
che finiscono alla pari.
Si conosce la probabilità p che ha la squadra INF di vincere in ogni singola partita, mentre q =
(1- p) è la probabilità di vincere in ogni singola partita della squadra MAT.
Indichiamo con P(i, j) la probabilità del team INF di vincere il torneo quando gli mancano i
vittorie, mentre all’avversario ne mancano j per aggiudicarsi il torneo. P(n, n) è pertanto la
probabilità iniziale
P(0, j) = 1 INF ha vinto, qualunque sia j > 0
P(i, 0) = 0 INF ha perso, qualunque sia i > 0
P(0, 0) è indefinito
P(i, j) = p . P(i-1, j) + q . P(i, j-1) i, j >= 1
3. Resto
Si hanno monete di n valori diversi e T[1..n] è un array che fornisce tali valori; per ogni valore
si dispone di un numero illimitato di monete. Si deve scegliere il minimo numero di monete il
cui valore complessivo ammonti ad un intero dato, minore o uguale ad L.
N.B. Si usi  per indicare l’impossibilità di formare la somma con le monete a disposizione.
P[i,j] =
0

P[i-1,j]
min {P[i-1,j], P[i, j-T[i]] + 1}
se j = 0
se i = 0 and j > 0
se j < T[i]
se i, j  0 and j  T[i]
4. Sottostringhe comuni
Siano date due stringhe P = p1,…,pm e T = t1,…,tn di caratteri. Si fornisca un algoritmo di
programmazione dinamica per individuare la più lunga sottostringa comune di caratteri
consecutivi.
M[i, 0] = M[0, j] = 0
M[i, j] = M[i-1, j-1] + 1
M[i, j] = 0
se P[i] = T[j]
se P[i] <> T[j]
5. Catene di montaggio.
Uno stabilimento automobilistico ha due catene di montaggio. Il telaio di un’automobile entra in
una catena, riceve nuovi componenti in un certo numero di stazioni e infine esce completa dalla
catena di montaggio. Ogni catena ha n stazioni: Si,j (i = 1, 2, j = 1, …, n). Le stazioni j-esime
su ognuna delle due catene eseguono le stesse lavorazioni, ma essendo state costruite con
tecnologie diverse, i tempi di lavorazione sono diversi. Sia ai,j il tempo di montaggio nella
stazione Si,j. Il telaio impiega un tempo ei per entrare nella prima stazione della catena i, i tempi
di spostamento da una stazione alla successiva della stessa catena sono trascurabili, mentre si ha
un tempo di uscita xi per l’automobile completa.
Quando si presenta un ordine urgente la macchina in lavorazione può essere trasferita da una
catena ad un’altra per minimizzare i tempi; in tal caso comunque si paga un tempo di
trasferimento ti,j per abbandonare la catena i, in uscita dalla j-esima stazione.
Il problema consiste nel determinare quali stazioni di lavorazione scegliere dalla catena 1 e
dalla catena 2 in modo da minimizzare il tempo totale di assemblaggio dell’automobile.