NSI (terminale) · Chapitre 7 · Exercice de TD
Problème — Sac à dos avec reconstruction des objets
La programmation dynamique · niveau 3 (difficile)
É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 .
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
- 7 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.