Advertisement
kajs54

Untitled

Mar 6th, 2024
796
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.91 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define N 100
  4. int maximum(int a, int b) {
  5.     if (a >= b) {
  6.         return a;
  7.     } else {
  8.         return b;
  9.     }
  10. }
  11. int existence_solution(int solutionSet[][N], int n, int* setIndex, int count[], int taille_solution) {
  12.     int i,j;
  13.     for (i = 0; i < *setIndex; i++) {
  14.         int trouve = 1;
  15.         for (j = 0; j < taille_solution; j++) {
  16.             if (solutionSet[i][j] != count[j]) {
  17.                 trouve = 0;
  18.                 break;
  19.             }
  20.         }
  21.         if (trouve) {
  22.             return 1;
  23.         }
  24.     }
  25.     return 0;
  26. }
  27. void afficherSolutions(int W, int poids[], int valeur[], int K[], int n, int count[], int solutionSet[][N], int* setIndex) {
  28.     if (W == 0) {
  29.         if (existence_solution(solutionSet, n, setIndex, count, n)) {
  30.             return;
  31.         }
  32.         for (int i = 0; i < n; i++) {
  33.             solutionSet[*setIndex][i] = count[i];
  34.         }
  35.         (*setIndex)++;
  36.  
  37.  
  38.         printf("{");
  39.         for (int i = 0; i < n; i++) {
  40.             printf("%d", count[i]);
  41.             if (i != n - 1) {
  42.                 printf(",");
  43.             }
  44.         }
  45.         printf("}\n");
  46.     } else {
  47.         for (int i = 0; i < n; i++) {
  48.             if (poids[i] <= W && K[W] == valeur[i] + K[W - poids[i]]) {
  49.                 count[i]++;
  50.                 afficherSolutions(W - poids[i], poids, valeur, K, n, count, solutionSet, setIndex);
  51.                 count[i]--;
  52.             }
  53.         }
  54.     }
  55. }
  56.  
  57. int sacADos(int poids_sac, int poids[], int valeur[], int n, int count[]) {
  58.     int i, weight;
  59.     int K[poids_sac + 1];
  60.  
  61.     K[0] = 0;
  62.  
  63.     for (weight = 1; weight <= poids_sac; weight++) {
  64.         K[weight] = 0;
  65.         for (i = 0; i < n; i++) {
  66.             if (poids[i] <= weight) {
  67.                 K[weight] = maximum(K[weight], valeur[i] + K[weight - poids[i]]);
  68.             }
  69.         }
  70.     }
  71.  
  72.     int solutionSet[N][N];
  73.     int setIndex = 0;
  74.  
  75.     printf("Solutions optimales:\n");
  76.     afficherSolutions(poids_sac, poids, valeur, K, n, count, solutionSet, &setIndex);
  77.     printf(" La valeur maximale de ce probleme de sac a dos: %d\n", K[poids_sac]);
  78.  
  79.     return K[poids_sac];
  80. }
  81.  
  82.  
  83. int main() {
  84.     int n, poids_sac;
  85.     printf("Entrez le nombre d'objet(s): ");
  86.     scanf("%d", &n);
  87.     printf("Entrez la capacite du sac a dos:");
  88.     scanf("%d", &poids_sac);
  89.     int poids[n], valeur[n], count[n];
  90.     printf("-----------------------------------***** S A C     A     D O S *****---------------------------------------\n");
  91.     printf("Entrez le poids et la valeur de chaque objet:\n");
  92.     for (int i = 0; i < n; i++) {
  93.         printf("Objet %d:\n", i + 1);
  94.         printf(" poids: ");
  95.         scanf("%d", &poids[i]);
  96.         printf(" la valeur de l'objet '%d': ",i+1);
  97.         scanf("%d", &valeur[i]);
  98.         count[i] = 0;
  99.     }
  100.     int res = sacADos(poids_sac, poids, valeur, n, count);
  101.  
  102.     return 0;
  103. }
  104.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement