Advertisement
kajs54

Untitled

Mar 7th, 2024
20
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.93 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 100
  4.  
  5. /**
  6. Ce code permet de resoudre le probleme de sac a dos ( 0,1,2,.....N) en utilisant la programmation dynamique et une approche récursive.
  7. Il commence par lire les données d'entrée, à savoir le nombre d'objets et la capacité maximale du sac à dos,
  8. ainsi que les poids et les valeurs de chaque objet.
  9. Ensuite, il calcule la valeur maximale que l'on peut obtenir en remplissant le sac à dos selon les poids et les valeurs des objets donnés.
  10. Cette valeur maximale est calculée en utilisant un tableau dynamique et en itérant sur chaque objet et chaque poids possible du sac à dos
  11. pour choisir la meilleure combinaison. Enfin, le programme affiche toutes les combinaisons optimales d'objets qui donnent la valeur maximale,
  12. en utilisant une approche récursive pour explorer toutes les possibilités.
  13. */
  14.  
  15. // Fonction pour trouver le maximum entre deux entiers
  16. int maximum(int a, int b) {
  17. if (a >= b) {
  18. return a;
  19. } else {
  20. return b;
  21. }
  22. }
  23.  
  24. // Fonction pour vérifier l'existence d'une solution dans un ensemble de solutions
  25. int existence_solution(int solutionSet[][N], int n, int* setIndex, int count[], int taille_solution) {
  26. int i, j;
  27. // Parcourir l'ensemble de solutions
  28. for (i = 0; i < *setIndex; i++) {
  29. int trouve = 1;
  30. // Vérifier si la solution actuelle correspond à la solution donnée
  31. for (j = 0; j < taille_solution; j++) {
  32. if (solutionSet[i][j] != count[j]) {
  33. trouve = 0;
  34. break;
  35. }
  36. }
  37. // Si la solution est trouvée, retourner vrai
  38. if (trouve) {
  39. return 1;
  40. }
  41. }
  42. // Si la solution n'est pas trouvée, retourner faux
  43. return 0;
  44. }
  45.  
  46. // Fonction pour afficher les solutions optimales du problème du sac à dos
  47. void afficherSolutions(int W, int poids[], int valeur[], int K[], int n, int count[], int solutionSet[][N], int* setIndex) {
  48. // Cas de base : poids actuel est 0
  49. if (W == 0) {
  50. // Vérifier si cette solution existe déjà dans l'ensemble
  51. if (existence_solution(solutionSet, n, setIndex, count, n)) {
  52. return;
  53. }
  54. // Ajouter la solution à l'ensemble
  55. for (int i = 0; i < n; i++) {
  56. solutionSet[*setIndex][i] = count[i];
  57. }
  58. (*setIndex)++;
  59.  
  60. // Afficher la solution
  61. printf("{");
  62. for (int i = 0; i < n; i++) {
  63. printf("%d", count[i]);
  64. if (i != n - 1) {
  65. printf(",");
  66. }
  67. }
  68. printf("}\n");
  69. } else {
  70. // Boucler à travers les objets disponibles
  71. for (int i = 0; i < n; i++) {
  72. // Vérifier si l'objet peut être inclus dans le sac
  73. if (poids[i] <= W && K[W] == valeur[i] + K[W - poids[i]]) {
  74. count[i]++;
  75. // Appel récursif pour explorer d'autres possibilités
  76. afficherSolutions(W - poids[i], poids, valeur, K, n, count, solutionSet, setIndex);
  77. count[i]--;
  78. }
  79. }
  80. }
  81. }
  82.  
  83. // Fonction principale pour résoudre le problème du sac à dos
  84. int sacADos(int poids_sac, int poids[], int valeur[], int n, int count[]) {
  85. int i, weight;
  86. int K[poids_sac + 1];
  87.  
  88. // Initialisation de la première valeur de la table K
  89. K[0] = 0;
  90.  
  91. // Remplissage de la table K avec les valeurs optimales
  92. for (weight = 1; weight <= poids_sac; weight++) {
  93. K[weight] = 0;
  94. for (i = 0; i < n; i++) {
  95. if (poids[i] <= weight) {
  96. // Calcul de la valeur optimale pour le poids donné
  97. K[weight] = maximum(K[weight], valeur[i] + K[weight - poids[i]]);
  98. }
  99. }
  100. }
  101.  
  102. // Déclaration d'un ensemble pour stocker les solutions
  103. int solutionSet[N][N];
  104. int setIndex = 0;
  105.  
  106. // Affichage des solutions optimales
  107. printf("Solutions optimales:\n");
  108. afficherSolutions(poids_sac, poids, valeur, K, n, count, solutionSet, &setIndex);
  109. printf(" La valeur maximale de ce probleme de sac a dos: %d\n", K[poids_sac]);
  110.  
  111. return K[poids_sac];
  112. }
  113.  
  114. // Fonction principale du programme
  115. int main() {
  116. int n, poids_sac;
  117. printf("Entrez le nombre d'objet(s): ");
  118. scanf("%d", &n);
  119. printf("Entrez la capacite du sac a dos:");
  120. scanf("%d", &poids_sac);
  121. int poids[n], valeur[n], count[n];
  122. printf("-----------------------------------***** S A C A D O S *****---------------------------------------\n");
  123. printf("Entrez le poids et la valeur de chaque objet:\n");
  124. for (int i = 0; i < n; i++) {
  125. printf("Objet %d:\n", i + 1);
  126. printf(" poids: ");
  127. scanf("%d", &poids[i]);
  128. printf(" la valeur de l'objet '%d': ",i+1);
  129. scanf("%d", &valeur[i]);
  130. count[i] = 0;
  131. }
  132. int res = sacADos(poids_sac, poids, valeur, n, count);
  133.  
  134. return 0;
  135. }
  136.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement