NSI (terminale) · Chapitre 8 · Exercice de TD
Problème — Comparer glouton et programmation dynamique sur le sac à dos entier
Les algorithmes gloutons · niveau 3 (difficile)
Énoncé
Problème — Comparer glouton et programmation dynamique sur le sac à dos entier.
On veut quantifier l'écart entre le glouton et l'optimum sur le sac à dos entier. Écrire les deux versions et comparer sur un exemple où le glouton échoue.
Corrigé
La version dynamique remplit un tableau dp[i][w] (valeur maximale avec les premiers objets et une capacité ).
def sac_entier_glouton(objets, W):
objets = sorted(objets, key=lambda o: o[1] / o[0], reverse=True)
reste, valeur = W, 0
for poids, val in objets:
if poids <= reste:
reste -= poids
valeur += val
return valeur
def sac_entier_dynamique(objets, W):
n = len(objets)
dp = [[0] * (W + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
poids, val = objets[i - 1]
for w in range(W + 1):
dp[i][w] = dp[i - 1][w] # objet i non pris
if poids <= w: # objet i pris
dp[i][w] = max(dp[i][w], dp[i - 1][w - poids] + val)
return dp[n][W]
objets = [(10, 60), (20, 100), (30, 120)]
print(sac_entier_glouton(objets, 50)) # 160 (sous-optimal)
print(sac_entier_dynamique(objets, 50)) # 220 (optimal)
Le glouton donne alors que l'optimum est : pour le sac à dos entier, le choix localement optimal (meilleur rapport valeur/poids) ne suffit pas. La programmation dynamique, en , examine toutes les combinaisons utiles et garantit l'optimum, au prix d'une complexité supérieure au du glouton.
100 % gratuit
Essaie le suivant avec le tuteur
- L'exercice suivant avec le tuteur, sans compte : il guide pas à pas, sans donner la réponse
- 8 autres exercices corrigés dans ce chapitre
- Les 2 QCM du chapitre, le premier sans compte
- Le podcast et la vidéo du chapitre : 2 minutes d'écoute sans compte
Sans compte : le cours, le premier QCM, 2 minutes de podcast et de vidéo et un exercice avec le tuteur. Pour tout le reste : inscription gratuite en 30 secondes, sans carte bancaire.