Devoir 8 Nsi
Devoir 8 Nsi
Devoir 8 Nsi
Cette évaluation est destinée à vous entrainer et ne doit pas être envoyée à la correction
Durée : 2h00
if iDebut == iFin:
return liste[iDebut]
iMilieu = (iDebut + iFin ) // 2
x = maximum(liste, iDebut, iMilieu)
y = maximum(liste , iMilieu + 1, iFin)
return x if x > y else y
1. Que se passe-t-il si on appelle cette fonction avec une liste vide comme argument ?
Dans la suite du devoir, on suppose que la fonction maximum n’est jamais appelée sur une liste vide.
2.
a) À quoi voit-on que cette fonction est récursive ? Vous citerez les lignes pertinentes.
b) Quels sont les cas d’arrêt de cette fonction ? Que renvoie-t-elle dans ces cas ? Vous donnerez
un exemple d’appel de cette fonction où l’algorithme rencontre immédiatement un tel cas.
3. On execute
d) On insère juste avant la ligne if iDebut == iFin: une ligne avec l’instruction suivante :
print(iDebut, iFin)
4. En vous inspirant de la fonction maximum(liste, iDebut, iFin), implémentez une fonction minimum(liste,
iDebut, iFin) qui renvoie, s’il existe, le minimum de la liste fournie en examinant les éléments dont les
indices vont de iDebut à iFin.
On suppose avoir n objets objet 1, … , objet n . Chaque objet i a un poids pi qui est un nombre entier
positif de kg et une utilité ui qui est mesurée elle aussi par un nombre entier positif.
On dispose d’autre part d’un sac à dos ayant une certaine capacité en poids.
Le problème du sac à dos est de chosir quels objets mettre dans le sac de manière à ce que la somme
des utilités des objets soit maximale, tout ayant un poids total au plus égal à la capacité supportée par
le sac à dos.
2. En faisant un autre choix d’objets, montrez que l’agorithme glouton n’est pas optimal.
Dans cette partie on étudie l’implémentation d’un algortihme donnant dans tous les cas une solution
optimale au problème du sac à dos.
2. Comment interpréter le nombre 147 qui termine l’affichage pour notre problème ?
1. L’exécution de
donne
147
{(0, 6): 0,
(0, 5): 0,
(1, 6): 12,
(0, 3): 0,
(0, 2): 0,
(1, 3): 12,
(2, 6): 87,
(1, 0): 0,
(2, 3): 75,
(3, 6): 147,
(0, 1): 0,
(0, 0): 0,
(1, 1): 12,
(2, 1): 12,
(3, 1): 12,
(4, 6): 147}
Comment interpréter par exemple (2,6): 87 pour notre problème de sac à dos ?
2. On trouve le nombre 147 à deux endroits de cet affichage. Qu’en déduire sur le choix final de l’objet 4 ?
3. Pour obtenir la liste des objets à prendre, on produit le code ci-dessous.
# Qu'a-t-on pris ?
#
i = len(mesObjets)
j = capaSac
while i > 0:
if V[i, j] > V[i - 1, j]: # Si on a pris l'objet_i
# /!\ objets numérotés à partir de zéro
# dans mesObjets
print(f"On a pris l'objet n°{i}"
+ f" qui pèse {mesObjets[i-1][0]} kg"
+ f" et qui vaut {mesObjets[i-1][1]}.")
j = j - mesObjets[i-1][0]
i = i - 1
Quel est l’affichage obtenu par l’exécution de celui-ci ? Quel est donc finalement le choix optimal pour
notre problème ?
Vous pouvez répondre à cette question en exécutant ce code, ou « à la main » à partir des valeurs de V.