Advertisement
kajs54

Untitled

Mar 6th, 2024
776
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.06 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4.  
  5. // Structure pour représenter un objet
  6. struct Objet {
  7.     int poids;
  8.     int valeur;
  9.     double ratio; // Rapport valeur/poids
  10. };
  11.  
  12. // Fonction pour comparer deux objets en fonction de leur ratio valeur/poids
  13. int comparer(const void *a, const void *b) {
  14.     const struct Objet *objetA = (const struct Objet *)a;
  15.     const struct Objet *objetB = (const struct Objet *)b;
  16.  
  17.     // Si le ratio de l'objet B est supérieur à celui de l'objet A, retourner 1, sinon retourner -1
  18.     if (objetB->ratio > objetA->ratio) {
  19.         return 1;
  20.     } else {
  21.         return -1;
  22.     }
  23. }
  24.  
  25. int maximum(int a, int b) {
  26.     return (a >= b) ? a : b;
  27. }
  28.  
  29. // Fonction récursive pour explorer toutes les combinaisons d'objets possibles
  30. void explorerSolutions(int poids_sac, struct Objet objets[], int K[], int n, int poids_actuel, int solution[], int *solution_count, int index, bool *solutions_seen) {
  31.     if (poids_actuel == poids_sac) {
  32.         // Nous avons atteint le poids maximal du sac à dos, ajouter cette solution à la liste des solutions
  33.         bool doublon = false;
  34.         for (int i = 0; i < *solution_count; i++) {
  35.             bool identique = true;
  36.             for (int j = 0; j < n; j++) {
  37.                 if (solution[i * n + j] != solution[j]) {
  38.                     identique = false;
  39.                     break;
  40.                 }
  41.             }
  42.             if (identique) {
  43.                 doublon = true;
  44.                 break;
  45.             }
  46.         }
  47.         if (!doublon) {
  48.             for (int i = 0; i < n; i++) {
  49.                 solutions_seen[*solution_count * n + i] = solution[i]; // Copier la solution actuelle
  50.             }
  51.             (*solution_count)++;
  52.         }
  53.         return;
  54.     }
  55.  
  56.     if (index == n) {
  57.         return; // Si nous avons examiné tous les objets, retourner
  58.     }
  59.  
  60.     // Inclure l'objet actuel dans la solution et passer à l'objet suivant
  61.     for (int i = 0; i <= poids_sac / objets[index].poids; i++) {
  62.         int poids_total = poids_actuel + objets[index].poids * i;
  63.         if (poids_total <= poids_sac && K[poids_total] == K[poids_actuel] + objets[index].valeur * i) {
  64.             solution[index] = i;
  65.             // Créer une nouvelle solution pour l'appel récursif suivant
  66.             int *new_solution = (int *)malloc(sizeof(int) * n);
  67.             for (int j = 0; j < n; j++) {
  68.                 new_solution[j] = solution[j];
  69.             }
  70.             explorerSolutions(poids_sac, objets, K, n, poids_total, new_solution, solution_count, index + 1, solutions_seen);
  71.             free(new_solution);
  72.         }
  73.     }
  74. }
  75. // Fonction pour afficher toutes les solutions optimales possibles
  76. void afficherSolutions(int poids_sac, struct Objet objets[], int K[], int n) {
  77.     int solution_count = 0;
  78.     int *solution = (int *)malloc(sizeof(int) * n);
  79.     bool *solutions_seen = (bool *)calloc(n * n * n, sizeof(bool));
  80.  
  81.     explorerSolutions(poids_sac, objets, K, n, 0, solution, &solution_count, 0, solutions_seen);
  82.  
  83.     printf("Solutions optimales:\n");
  84.     for (int i = 0; i < solution_count; i++) {
  85.         printf("{");
  86.         for (int j = 0; j < n; j++) {
  87.             printf("%d", solution[j]);
  88.             if (j != n - 1) {
  89.                 printf(",");
  90.             }
  91.         }
  92.         printf("}\n");
  93.     }
  94.  
  95.     free(solution);
  96.     free(solutions_seen);
  97. }
  98.  
  99. void sacADos(int poids_sac, struct Objet objets[], int n) {
  100.     // Tri des objets en fonction du rapport valeur/poids
  101.     qsort(objets, n, sizeof(struct Objet), comparer);
  102.  
  103.     // Tableau pour stocker les valeurs maximales
  104.     int K[poids_sac + 1];
  105.     K[0] = 0;
  106.  
  107.     // Initialisation du tableau K
  108.     for (int i = 1; i <= poids_sac; i++) {
  109.         K[i] = 0;
  110.     }
  111.  
  112.     // Recherche dynamique
  113.     for (int i = 0; i < n; i++) {
  114.         for (int j = poids_sac; j >= objets[i].poids; j--) {
  115.             K[j] = maximum(K[j], objets[i].valeur + K[j - objets[i].poids]);
  116.         }
  117.     }
  118.  
  119.     // Affichage de la valeur maximale
  120.     printf("La valeur maximale de ce probleme de sac a dos: %d\n", K[poids_sac]);
  121.  
  122.     // Affichage de toutes les solutions optimales
  123.     afficherSolutions(poids_sac, objets, K, n);
  124. }
  125.  
  126. int main() {
  127.     int n, poids_sac;
  128.     printf("Entrez le nombre d'objet(s): ");
  129.     scanf("%d", &n);
  130.     printf("Entrez la capacite du sac a dos: ");
  131.     scanf("%d", &poids_sac);
  132.  
  133.     // Allocation dynamique d'un tableau d'objets
  134.     struct Objet *objets = (struct Objet *)malloc(n * sizeof(struct Objet));
  135.  
  136.     printf("Entrez le poids et la valeur de chaque objet:\n");
  137.     for (int i = 0; i < n; i++) {
  138.         printf("Objet %d:\n", i + 1);
  139.         printf("Poids: ");
  140.         scanf("%d", &objets[i].poids);
  141.         printf("Valeur: ");
  142.         scanf("%d", &objets[i].valeur);
  143.         objets[i].ratio = (double)objets[i].valeur / objets[i].poids; // Calcul du rapport valeur/poids
  144.     }
  145.  
  146.     // Appel de la fonction sacADos
  147.     sacADos(poids_sac, objets, n);
  148.  
  149.     // Libération de la mémoire allouée pour le tableau d'objets
  150.     free(objets);
  151.  
  152.     return 0;
  153. }
  154.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement