Problème d'installation des étagères

01 May 2019 01 May 2019 10815 vues ESSADDOUKI Mostafa 7 min de lecture
Problème : Étagères murales Étant donné la longueur du mur L et des étagères de deux longueurs m et n, trouvez le nombre de chaque type d'étagère à utiliser et l'espace disponible restant dans la solution optimale, de sorte que l'espace vide soit minimal.

La plus grande des deux étagères est moins chère, c'est donc préférable. Cependant, le coût est secondaire et la première priorité est de minimiser l'espace vide sur le mur.

  Exemples

Exemple 1
Entrée
L = 7
m = 3
n = 5
Sortie
2 0 1
Explication : Nous utilisons deux unités de type m (2 × 3 = 6) et il reste 1 espace vide. (2 × 3 + 0 × 5 = 6 ; 7 - 6 = 1)
Exemple 2
Entrée
L = 29
m = 3
n = 9
Sortie
0 3 2
Explication : Nous utilisons trois unités de type n (3 × 9 = 27) et il reste 2 espace vide. (0 × 3 + 3 × 9 = 27 ; 29 - 27 = 2)
Exemple 3
Entrée
L = 24
m = 4
n = 7
Sortie
6 0 0
Explication : Nous utilisons six unités de type m (6 × 4 = 24) et il n'y a aucun espace vide. Solution parfaite !

Une approche simple et efficace consistera à essayer toutes les combinaisons possibles d'étagères qui s'insèrent dans la longueur du mur.

Pour mettre en œuvre cette approche avec la contrainte que les plus grandes étagères coûtent moins cher que la plus petite, à partir de 0, nous n'augmentons pas les étagères de type plus grand jusqu'à ce qu'elles puissent être ajustées. Pour chaque cas, nous calculons l'espace vide et stockons finalement cette valeur qui minimise l'espace vide. Si l'espace vide est identique dans les deux cas, nous préférons celui qui a plus de grandes étagères (car elles sont moins chères).

1. Initialiser le nombre optimal d'étagères de type m (nb_m) à L/m
   Initialiser le nombre optimal d'étagères de type n (nb_n) à 0
   Initialiser l'espace vide minimal (reste) à L % m

2. Tant que L ≥ n (on peut ajouter une étagère de type n) :
   a. Ajouter une étagère de type n (nb_n++)
   b. Réduire L de n
   c. Calculer le nombre possible d'étagères de type m avec le L restant : p = L/m
   d. Calculer l'espace vide restant : r = L % m
   e. Si r < reste (meilleure solution) :
        Mettre à jour nb_m, nb_n et reste avec les nouvelles valeurs
   f. Si r == reste (égalité d'espace vide) :
        Préférer la solution avec plus d'étagères de type n (moins chères)

3. Retourner (nb_m, nb_n, reste)
#include <stdio.h>

void probEtageres(int L, int m, int n) {
    int nb_m = L / m;        // Nombre optimal d'étagères de type m
    int nb_n = 0;            // Nombre optimal d'étagères de type n
    int reste = L % m;       // Espace vide minimal
    int L_original = L;      // Sauvegarder la valeur originale
    
    // Variable pour la solution courante
    int p, q = 0, r;
    
    while (L >= n) {
        q++;                 // Ajouter une étagère de type n
        L -= n;              // Réduire la longueur disponible
        
        p = L / m;           // Nombre d'étagères de type m possibles
        r = L % m;           // Espace vide avec cette configuration
        
        // Si on trouve un espace vide plus petit
        if (r < reste) {
            nb_m = p;
            nb_n = q;
            reste = r;
        }
        // Si espace vide égal, préférer plus d'étagères de type n (moins chères)
        else if (r == reste && q > nb_n) {
            nb_m = p;
            nb_n = q;
            reste = r;
        }
    }
    
    printf("%d %d %d\n", nb_m, nb_n, reste);
    printf("(Solution : %d × %d + %d × %d = %d ; reste = %d)\n", 
           nb_m, m, nb_n, n, nb_m * m + nb_n * n, reste);
}

int main() {
    // Test des exemples
    printf("Exemple 1 : L=7, m=3, n=5\n");
    probEtageres(7, 3, 5);
    
    printf("\nExemple 2 : L=29, m=3, n=9\n");
    probEtageres(29, 3, 9);
    
    printf("\nExemple 3 : L=24, m=4, n=7\n");
    probEtageres(24, 4, 7);
    
    return 0;
}
def probEtageres(L, m, n):
    """
    Résout le problème d'étagères murales.
    
    Paramètres:
    L (int): Longueur du mur
    m (int): Longueur du premier type d'étagère (plus petite)
    n (int): Longueur du second type d'étagère (plus grande, moins chère)
    
    Retourne:
    tuple: (nb_m, nb_n, reste) où nb_m est le nombre d'étagères de type m,
           nb_n le nombre d'étagères de type n, et reste l'espace vide.
    """
    # Initialisation avec uniquement des étagères de type m
    nb_m = L // m
    nb_n = 0
    reste = L % m
    
    # q compte le nombre d'étagères de type n
    q = 0
    L_temp = L
    
    while L_temp >= n:
        q += 1
        L_temp -= n
        
        # Avec q étagères de type n, combien peut-on mettre de type m ?
        p = L_temp // m
        r = L_temp % m
        
        # Si on trouve un espace vide plus petit
        if r < reste:
            nb_m = p
            nb_n = q
            reste = r
        # Si espace vide égal, préférer plus d'étagères de type n (moins chères)
        elif r == reste and q > nb_n:
            nb_m = p
            nb_n = q
            reste = r
    
    return nb_m, nb_n, reste

def afficher_solution(L, m, n):
    """Affiche la solution de façon détaillée"""
    nb_m, nb_n, reste = probEtageres(L, m, n)
    total = nb_m * m + nb_n * n
    
    print(f"Entrée : L={L}, m={m}, n={n}")
    print(f"Sortie : {nb_m} {nb_n} {reste}")
    print(f"Solution : {nb_m} × {m} + {nb_n} × {n} = {total} ; reste = {L - total}")
    print()

# Tester la fonction avec les exemples
print("Exemple 1 :")
afficher_solution(7, 3, 5)

print("Exemple 2 :")
afficher_solution(29, 3, 9)

print("Exemple 3 :")
afficher_solution(24, 4, 7)

# Test interactif
print("--- Test personnalisé ---")
L = int(input("Longueur du mur L : "))
m = int(input("Longueur petite étagère m : "))
n = int(input("Longueur grande étagère n : "))
nb_m, nb_n, reste = probEtageres(L, m, n)
print(f"Résultat : {nb_m} {nb_n} {reste}")
Sortie
Exemple 1 :
Entrée : L=7, m=3, n=5
Sortie : 2 0 1
Solution : 2 × 3 + 0 × 5 = 6 ; reste = 1

Exemple 2 :
Entrée : L=29, m=3, n=9
Sortie : 0 3 2
Solution : 0 × 3 + 3 × 9 = 27 ; reste = 2

Exemple 3 :
Entrée : L=24, m=4, n=7
Sortie : 6 0 0
Solution : 6 × 4 + 0 × 7 = 24 ; reste = 0
Analyse de complexité
  • Complexité temporelle : O(L/n) dans le pire cas, où L est la longueur du mur et n la longueur de la grande étagère.
  • Complexité spatiale : O(1) - nous n'utilisons que quelques variables.
Cas particuliers
  • Si l'une des longueurs d'étagère est nulle : solution triviale avec l'autre type.
  • Si m et n sont tous deux plus grands que L : aucune étagère ne peut être placée, l'espace vide est L.
  • Si m == n : le problème devient un choix unique d'étagères.
Sortie
// La sortie apparaîtra ici…
Prêt · Ctrl+Entrée pour exécuter

Discussion (0)

Soyez le premier à laisser un commentaire !

Laisser un commentaire

Votre commentaire sera visible après modération.