Python (école d'ingénieur) · Chapitre 2 · Exercice
Problème du sac à dos (version gloutonne)
Structures de contrôle : conditions et boucles
Énoncé
On dispose d'objets de poids et de valeurs , et d'un sac de capacité . La version fractionnaire autorise à prendre des fractions d'objets. Implémenter l'algorithme glouton (trier par rapport valeur/poids) et calculer la valeur maximale.
Corrigé
def sac_a_dos_fractionnaire(poids, valeurs, capacite):
"""
Retourne la valeur maximale pour le problème du sac à dos fractionnaire.
Complexité : O(n log n) due au tri
"""
n = len(poids)
objets = [(valeurs[i] / poids[i], poids[i], valeurs[i]) for i in range(n)]
objets.sort(reverse=True) # Tri par rapport valeur/poids décroissant
valeur_totale = 0.0
capacite_restante = capacite
for ratio, p, v in objets:
if capacite_restante >= p:
# Prendre l'objet entier
valeur_totale += v
capacite_restante -= p
else:
# Prendre une fraction
fraction = capacite_restante / p
valeur_totale += fraction * v
break # Sac plein
return valeur_totale
Exemple :
poids = [10, 20, 30]
valeurs = [60, 100, 120]
capacite = 50
# Ratios : 6.0, 5.0, 4.0
# Ordre : objet 0 (ratio 6.0, poids 10), objet 1 (ratio 5.0, poids 20), objet 2 (ratio 4.0)
# Prendre objet 0 : reste 40, valeur 60
# Prendre objet 1 : reste 20, valeur 160
# Prendre 20/30 de l'objet 2 : valeur 160 + (2/3)*120 = 240
Remarque : L'algorithme glouton est optimal pour la version fractionnaire, mais pas pour la version 0/1 (non fractionnaire).
100 % gratuit
La suite du chapitre est sur Adloun
- 4 autres exercices corrigés dans ce chapitre, et 5 à chercher avec le tuteur
- Les 2 QCM du chapitre, le premier sans compte
- Le tuteur, qui guide pas à pas sans donner la réponse
Sans compte : le cours et le premier QCM. Exercices et tuteur : inscription gratuite en 30 secondes, sans carte bancaire.