Mise en boîtes

Exercice

Sujet inspiré de https://prologin.org/train/2023/qualification/mise_en_boites

Cyril et 5 de ses amis sont en train de choisir leur film quand Cyril se rend compte que les restes du repas qu'ils ont dégusté juste avant attendent encore sur la table basse. Pour conserver leurs aliments, il faut les mettre dans des boîtes et les ranger au réfrigérateur. Qui sait, ils pourraient en avoir besoin si d'aventure ils décidaient de se lancer dans un grand voyage ! Le hasard faisant bien les choses, ils ont autant de boîtes que de restes. Tous les récipients ne sont toutefois pas forcément de la bonne taille.

Aidez nos 6 amis à remplir le plus de boîtes sachant qu'un aliment d'un certain volume ne peut entrer que dans une boîte d'un volume supérieur ou égal. Afin de conserver au mieux le goût de la nourriture, on ne mettra qu'un aliment dans chaque boîte.

Complétez dans tp12_vers_13.py, la fonction mise_en_boite(restes, boites) pour que sa spécification et les tests unitaires fournis soient satisfaits.

🐍 Script Python
def mise_en_boite(restes, boites):
    """
    Renvoie le nombre maximal de boites pour placer chaque reste
    d'aliment   dans une boite qui peut le contenir

    Paramètres :
    restes : liste de volumes d'aliments (entiers positifs)
    boites : liste de volumes de boites (entiers positifs)

    Retour: un entier positif
    """

Exemple 1 :

🐍 Script Python
>>> mise_en_boite([832, 342, 500], [750, 250, 500])
2

Ici on peut mettre l'aliment de 500 cm³ dans la boîte de 500 cm³. Le reste de 342 cm³ peut être rangé dans la boîte de 750 cm³. On peut aussi mettre le reste de 342 cm³ dans la boîte de 500 cm³ et celui de 500 cm³ dans la boîte de 750 cm³.

Exemple 2 :

🐍 Script Python
>>> mise_en_boite([487, 601, 584, 819, 601], [750, 500, 700, 65, 700])
4

Voici une liste possible de paires (reste, boîte) : (487, 500), (584, 650), (601, 700), (601, 700). On aurait pu également mettre un aliment de 601 cm³ dans la boîte de 750 cm³. Le mets de 819 cm³ ne peut être mis en boîte.

###
# Tests de basebksl-nlbksl-nlbksl-nldef testpy-undmisepy-undenpy-undboite():bksl-nl restes1 = [832, 342, 500]bksl-nl boites1 = [750, 250, 500]bksl-nl assert misepy-undenpy-undboite(restes1, boites1) == 2bksl-nl restes2 = [487, 601, 584, 819, 601]bksl-nl boites2 = [750, 500, 700, 65, 700]bksl-nl assert misepy-undenpy-undboite(restes2, boites2) == 4bksl-nl restes3 = [500, 700, 600, 750, 800, 600]bksl-nl boites3 = [400, 750, 750, 700, 700, 600]bksl-nl assert misepy-undenpy-undboite(restes3, boites3) == 5bksl-nlbksl-nlbksl-nltestpy-undmisepy-undenpy-undboite()bksl-nlbksl-nl 5/5

def misepy-undenpy-undboite(restes, boites):bksl-nl """bksl-nl Renvoie le nombre maximal de boites pour placer chaque restebksl-nl d'aliment dans une boite qui peut le contenirbksl-nlbksl-nl Paramètres :bksl-nl restes : liste de volume d'aliments (entiers positifs)bksl-nl boites : liste de volume de boite (entiers positifs)bksl-nlbksl-nl Retour: un entierbksl-nl """bksl-nl # à compléterbksl-nlbksl-nlbksl-nldef testpy-undmisepy-undenpy-undboite():bksl-nl """Tests unitaires pour mise en boite"""bksl-nl restes1 = [832, 342, 500]bksl-nl boites1 = [750, 250, 500]bksl-nl assert misepy-undenpy-undboite(restes1, boites1) == 2bksl-nl restes2 = [487, 601, 584, 819, 601]bksl-nl boites2 = [750, 500, 700, 65, 700]bksl-nl assert misepy-undenpy-undboite(restes2, boites2) == 4bksl-nl print("Tests réussis pour misepy-undenpy-undboite")bksl-nlbksl-nldef misepy-undenpy-undboite(restes, boites):bksl-nl """bksl-nl Renvoie le nombre maximal de boites pour placer chaque restebksl-nl d'aliment dans une boite qui peut le contenirbksl-nlbksl-nl Paramètres :bksl-nl restes : liste de volume d'aliments (entiers positifs)bksl-nl boites : liste de volume de boite (entiers positifs)bksl-nlbksl-nl Retour: un entierbksl-nl """bksl-nl # à compléterbksl-nl # BEGIN CUTbksl-nl # on trie d'abord les listes restes et boites par ordre croissantbksl-nl restespy-undtri = sorted(restes)bksl-nl boitespy-undtri = sorted(boites)bksl-nl ir = 0bksl-nl for b in boitespy-undtri:bksl-nl # Choix glouton : on choisit la boite b si elle peut contenirbksl-nl # le plus petit aliment restant ( restespy-undtri[ir] car restespy-undtri dans l'ordre croissant)bksl-nl # choix jamais remis en cause par la suite : si la boite ne peut pas contenirbksl-nl # le plus petit aliment, elle ne pourra pas contenir les autresbksl-nl if restespy-undtri[ir] <= b:bksl-nl ir = ir + 1bksl-nl return irbksl-nl # END CUTbksl-nlbksl-nlbksl-nldef misepy-undenpy-undboite2(restes, boites):bksl-nl """bksl-nl Renvoie le nombre maximal de boites pour placer chaque restebksl-nl d'aliment dans une boite qui peut le contenirbksl-nlbksl-nl Paramètres :bksl-nl restes : liste de volume d'aliments (entiers positifs)bksl-nl boites : liste de volume de boite (entiers positifs)bksl-nlbksl-nl Retour: un entierbksl-nl """bksl-nl # à compléterbksl-nl # BEGIN CUTbksl-nl # on trie d'abord les listes restes et boites par ordre décroissantbksl-nl restespy-undtri = sorted(restes, reverse=True)bksl-nl boitespy-undtri = sorted(boites, reverse=True)bksl-nl ib = 0bksl-nl for r in restespy-undtri:bksl-nl # Choix glouton : on choisit l'aliment r s'il peut être contenubksl-nl # dans la plus grande boite restante ( boitespy-undtri[ib] car boitespy-undtri dans l'ordre décroissant)bksl-nl # choix jamais remis en cause par la suite : si l'aliment est trop grand pour la plus grande boitebksl-nl # il le sera pour les autresbksl-nl if boitespy-undtri[ib] >= r:bksl-nl ib = ib + 1bksl-nl return ibbksl-nl # END CUTbksl-nlbksl-nl

A

Z

Correction