Adloun

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

Faire l'exercice suivant avec le tuteur

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.

Le cours du chapitre · Tous les exercices du chapitre

Exercice suivant avec le tuteur →