From 70f920a16ccd30dbb93c0439abd0e014c95cf9f6 Mon Sep 17 00:00:00 2001 From: Spectre Date: Tue, 13 May 2025 23:01:13 +0200 Subject: [PATCH] pas compris --- programmation_dynamique/bag/main.py | 27 ++++++++++++++----- .../{ => 05-05-2025}/pro_dynamique.py | 0 question_du_jour/12-05-2025/main.py | 20 ++++++++++++++ 3 files changed, 41 insertions(+), 6 deletions(-) rename question_du_jour/{ => 05-05-2025}/pro_dynamique.py (100%) create mode 100644 question_du_jour/12-05-2025/main.py diff --git a/programmation_dynamique/bag/main.py b/programmation_dynamique/bag/main.py index 4208834..404aeff 100644 --- a/programmation_dynamique/bag/main.py +++ b/programmation_dynamique/bag/main.py @@ -50,7 +50,7 @@ def entier_vers_binaire(n: int, taille: int) -> list: return bits -def ensemble_des_parties(ensemble: list) -> iterator: +def ensemble_des_parties(ensemble: list): """ Construit l'itérable enumérant toutes les parties d'un ensemble. PARAM. : @@ -100,7 +100,7 @@ def sac_a_dos_glouton(videos, capacite, cle): return sélection, totale_duree, totale_taille -def sac_a_dos_dynamique(videos, capacite): +'''def sac_a_dos_dynamique(videos, capacite): precision = 100 capacite = int(capacite * precision) liste = list(videos.items()) @@ -122,7 +122,22 @@ def sac_a_dos_dynamique(videos, capacite): nom, info = liste[i - 1] selection.append(nom) cap -= int(info["taille"] * precision) - return selection[::-1] + return selection[::-1]''' + + +def sac_a_dos_dynamique(videos, capacite): + dp = [(0, []) for _ in range(capacite + 1)] + for nom, info in videos.items(): + duree = info['Durée'] + taille = info['taille'] + for c in range(capacite, taille - 1, -1): + prev_duree, prev_sel = dp[c - taille] + if prev_duree + duree > dp[c][0]: + dp[c] = (prev_duree + duree, prev_sel + [nom]) + return dp[capacite][1] + + + if __name__ == "__main__": @@ -148,15 +163,15 @@ if __name__ == "__main__": ) print("--- Glouton par durée décroissante ---") print( - f"Vidéos : {sel_duree}\nDurée : {dur_duree} min\nTaille : {taille_duree:.3f} Go\n" + f"Vidéos : {selection_duree}\nDurée : {dur_duree} min\nTaille : {taille_duree:.3f} Go\n" ) print("--- Glouton par taille croissante ---") print( - f"Vidéos : {sel_taille}\nDurée : {dur_taille} min\nTaille : {taille_taille:.3f} Go\n" + f"Vidéos : {selection_taille}\nDurée : {dur_taille} min\nTaille : {taille_taille:.3f} Go\n" ) print("--- Glouton par ratio durée/taille ---") print( - f"Vidéos : {sel_ratio}\nDurée : {dur_ratio} min\nTaille : {taille_ratio:.3f} Go\n" + f"Vidéos : {selection_ratio}\nDurée : {dur_ratio} min\nTaille : {taille_ratio:.3f} Go\n" ) videos_mb = [ (nom, (info["Durée"], int(round(info["Taille"] * 1000)))) diff --git a/question_du_jour/pro_dynamique.py b/question_du_jour/05-05-2025/pro_dynamique.py similarity index 100% rename from question_du_jour/pro_dynamique.py rename to question_du_jour/05-05-2025/pro_dynamique.py diff --git a/question_du_jour/12-05-2025/main.py b/question_du_jour/12-05-2025/main.py new file mode 100644 index 0000000..726479f --- /dev/null +++ b/question_du_jour/12-05-2025/main.py @@ -0,0 +1,20 @@ +def force_brute(liste, i, j): + summs = [] + for start in range(i, j): + for end in range(start + 1, j + 1): + summs.append(sum(liste[start:end])) + return max(summs) + + +def somme_max(liste): + max_actuel = max_total = liste[0] + for x in liste[1:]: + max_actuel = max(x, max_actuel + x) + max_total = max(max_total, max_actuel) + return max_total + + +if __name__ == "__main__": + liste = [4, -1, -2, 5, -2] + m = force_brute(liste, 0, 5) + print(m)