Adloun

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.