Problème — Sac à dos avec reconstruction des objets
Exercice de TD · niveau 3 (difficile) · NSI (terminale), chapitre 7 — La programmation dynamique
Énoncé
Problème — Sac à dos avec reconstruction des objets.
Reprendre le problème du sac à dos 0/1, mais cette fois renvoyer non seulement la valeur maximale, mais aussi la liste des indices des objets sélectionnés.
Corrigé
On remplit d'abord la table comme précédemment. Pour reconstruire la sélection, on parcourt la table à rebours : à chaque étape, si , c'est que l'objet a été pris, et l'on diminue la capacité de son poids.
def sac_a_dos_objets(poids, valeurs, capacite):
n = len(poids)
table = [[0] * (capacite + 1) for _ in range(n + 1)]
for i in range(1, n + 1):
for c in range(capacite + 1):
if poids[i - 1] > c:
table[i][c] = table[i - 1][c]
else:
table[i][c] = max(
table[i - 1][c],
valeurs[i - 1] + table[i - 1][c - poids[i - 1]]
)
# Reconstruction
objets = []
c = capacite
for i in range(n, 0, -1):
if table[i][c] != table[i - 1][c]:
objets.append(i - 1)
c -= poids[i - 1]
objets.reverse()
return table[n][capacite], objets
La complexité reste pour le remplissage, et la reconstruction se fait en .
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.