mirror of
https://github.com/Fare-spec/cours.git
synced 2025-12-07 10:50:36 +00:00
90 lines
2.6 KiB
Python
90 lines
2.6 KiB
Python
Videos = {
|
|
"Video 1": {"Durée": 114, "Taille": 4.57},
|
|
"Video 2": {"Durée": 32, "Taille": 0.63},
|
|
"Video 3": {"Durée": 20, "Taille": 1.65},
|
|
"Video 4": {"Durée": 4, "Taille": 0.085},
|
|
"Video 5": {"Durée": 18, "Taille": 2.15},
|
|
"Video 6": {"Durée": 80, "Taille": 2.71},
|
|
"Video 7": {"Durée": 5, "Taille": 0.32},
|
|
}
|
|
|
|
|
|
def dico_vers_liste(dico: dict) -> list:
|
|
"""
|
|
Conversion d'un dictionnaire en liste.
|
|
PARAM. :
|
|
- dico : DICT, dictionnaire à applatir
|
|
RESULT. :
|
|
- LIST, chaque élément de la liste est un tuple (cle, valeur) du dictionnaire.
|
|
PRECOND. :
|
|
- aucune
|
|
EFFET DE BORD :
|
|
- aucun
|
|
|
|
"""
|
|
return list(
|
|
dico.items() # j'ai remplacer le code de base qui contenait Videos a la place de dico dans le return
|
|
)
|
|
|
|
|
|
def entier_vers_binaire(n: int, taille: int) -> list:
|
|
"""
|
|
Conversion d'un entier en binaire sur une taille donnée.
|
|
PARAM. :
|
|
- n : INT, le nombre à convertir
|
|
- taille : INT, la taille (nb de bits) fixe de la représentation
|
|
RESULT. :
|
|
- LIST, la liste des bits de la représentation en binaire,
|
|
indexée par le poids
|
|
PRECONDITION :
|
|
- n < 2**taille : un entier >= 2**taille n'est pas représentable
|
|
dans la taille donnée
|
|
EFFET DE BORD :
|
|
- aucun
|
|
"""
|
|
assert 2**taille > n, "Taille de représentation trop petite"
|
|
bits = [0] * taille
|
|
for i in range(taille):
|
|
bits[i] = (n >> i) & 1
|
|
|
|
return bits
|
|
|
|
|
|
def ensemble_des_parties(ensemble: list) -> iterator:
|
|
"""
|
|
Construit l'itérable enumérant toutes les parties d'un ensemble.
|
|
PARAM. :
|
|
- ensemble : LIST, la liste des éléments de l'ensemble
|
|
RESULT. :
|
|
- ITERATOR, le générateur de toutes les parties de l'ensemble
|
|
PRECONDITION :
|
|
- aucune
|
|
EFFET DE BORD :
|
|
- aucun
|
|
"""
|
|
n = len(ensemble)
|
|
for mask in range(2**n):
|
|
partie = [ensemble[i] for i in range(n) if (mask >> i) & 1]
|
|
yield partie
|
|
|
|
def total_duree(partie):
|
|
return sum(elt[1]['Durée'] for elt in partie)
|
|
def total_taille(partie):
|
|
return sum(elt[1]['Taille'] for elt in partie)
|
|
|
|
def sac_a_dos_force_brute(videos, capacite):
|
|
meilleur = ([], 0, 0.0)
|
|
for partie in ensemble_des_parties(videos):
|
|
taille = total_taille(partie)
|
|
duree = total_duree(partie)
|
|
if taille <= capacite and duree > meilleur[1]:
|
|
meilleur = ([v[0] for v in partie], duree, taille)
|
|
return meilleur
|
|
|
|
if __name__ == "__main__":
|
|
# Conversion du dictionnaire des vidéos en liste
|
|
liste_videos = dico_vers_liste(Videos)
|
|
# Affichage de contrôle
|
|
for video in liste_videos:
|
|
print(video)
|