p[i] + coupe_recurs(l-i, p)
fonction coupe_recurs(l, p):
si l = 0:
renvoyer l
optim ← 0 ( ou optim = p[l] = le revenu minimal que l'on peut avoir avec cette longueur...)
pour i de 1 à l:
revenu ← p[i] + coupe_recurs(l-i, p)
si revenu > optim:
optim ← revenu
renvoyer optim
Implémentation :
def coupe_recurs(l: int, p: list)->int:
if l == 0:
return l
optim = 0 # ou optim = p[l]
for i in range(1, l+1):
revenu = p[i]+coupe_recurs(l-i, p)
if revenu > optim:
optim = revenu
return optim
print(coupe_recurs(9, p)
def coupe_dyna_TB(l, p, r):
if r[l] != None:
return r[l]
if l == 0:
r[l] = 0
else:
for i in range(1, l+1):
revenu = p[i]+coupe_dyna_TB(l-i, p, r)
if revenu > r[l]:
r[l] = revenu
return r[l]
l = 9
r = [None]*(l+1) # tableau à passer au premier appel de la fonction
Le remplissage du tableau r des résultats successifs, de taille l+1, se fait en partant de l'indice 0; par exemple,
pour l = 4 :
Donc, pour une planche de longueur i, le revenu optimal sera : r[i] = max(p[j]+r[i-j]), pour toutes les valeurs
de j de 0 à i.
Le tableau r contiendra alors tous les revenus optimaux pour chaque longueur i, mais seul le dernier nous intérèsse...
def dyna_coupe_BU(l, p):
r = [0 for i in range(l+1)]
for i in range (1, l+1):
r[i] = 0
for j in range (0, i+1):
revenu = p[j] + r[i-j]
if revenu > r[i]:
r[i] = revenu
return r[n]
<<<<<<< HEAD
=======