0-1 Knapsack Code In C++

7 min read Jun 03, 2024
0-1 Knapsack Code In C++

Le problème du sac à dos 0-1 en C++ : Une solution efficace

Le problème du sac à dos 0-1 est un problème classique en informatique qui implique la maximisation de la valeur des objets qui peuvent être placés dans un sac à dos de capacité limitée. Dans ce problème, vous avez un ensemble d'objets, chacun avec un poids et une valeur, et un sac à dos avec une capacité de poids maximale. Le but est de sélectionner les objets à mettre dans le sac à dos afin de maximiser la valeur totale, sans dépasser la capacité du sac à dos.

Comprendre l'approche

L'approche la plus courante pour résoudre le problème du sac à dos 0-1 est la programmation dynamique. Cette approche utilise un tableau pour stocker les solutions optimales pour les sous-problèmes. Le tableau est indexé par la capacité du sac à dos et le nombre d'objets considérés. Chaque cellule du tableau contient la valeur maximale que l'on peut obtenir en utilisant les objets jusqu'à cet index avec la capacité du sac à dos correspondante.

Code C++ pour le problème du sac à dos 0-1

#include 
#include 

using namespace std;

int knapsack(int capacity, const vector& values, const vector& weights, int n) {
  // Créer un tableau pour stocker les solutions optimales
  vector> dp(n + 1, vector(capacity + 1, 0));

  // Remplir le tableau de manière itérative
  for (int i = 1; i <= n; i++) {
    for (int w = 1; w <= capacity; w++) {
      if (weights[i - 1] <= w) {
        // Si l'objet actuel peut tenir dans le sac à dos
        // prendre le maximum entre l'inclure ou non
        dp[i][w] = max(values[i - 1] + dp[i - 1][w - weights[i - 1]], dp[i - 1][w]);
      } else {
        // Si l'objet actuel ne peut pas tenir dans le sac à dos
        // prendre la valeur de la solution précédente
        dp[i][w] = dp[i - 1][w];
      }
    }
  }

  // La valeur maximale est stockée dans la dernière cellule du tableau
  return dp[n][capacity];
}

int main() {
  // Valeurs des objets
  vector values = {60, 100, 120};
  // Poids des objets
  vector weights = {10, 20, 30};
  // Capacité du sac à dos
  int capacity = 50;

  // Nombre d'objets
  int n = values.size();

  // Résoudre le problème du sac à dos 0-1
  int maxValue = knapsack(capacity, values, weights, n);

  // Afficher la valeur maximale
  cout << "La valeur maximale du sac à dos est : " << maxValue << endl;

  return 0;
}

Explication du code

  1. Le code commence par inclure les en-têtes nécessaires et définir l'espace de noms std.
  2. La fonction knapsack prend en entrée la capacité du sac à dos, les valeurs et les poids des objets et le nombre d'objets.
  3. Un tableau 2D dp est créé pour stocker les solutions optimales pour les sous-problèmes. La première ligne et la première colonne du tableau sont initialisées à zéro.
  4. Le code utilise deux boucles imbriquées pour remplir le tableau dp de manière itérative. La première boucle itère sur tous les objets et la deuxième boucle itère sur toutes les capacités du sac à dos possibles.
  5. Pour chaque cellule dp[i][w], le code vérifie si l'objet actuel peut tenir dans le sac à dos avec la capacité w.
  6. Si l'objet actuel peut tenir, le code prend le maximum entre l'inclure dans le sac à dos ou non.
  7. Si l'objet actuel ne peut pas tenir, le code prend la valeur de la solution précédente dp[i - 1][w].
  8. La valeur maximale est stockée dans la dernière cellule du tableau dp[n][capacity].
  9. La fonction main crée un exemple de jeu de données pour les valeurs, les poids et la capacité du sac à dos.
  10. La fonction knapsack est appelée avec ces données et la valeur maximale obtenue est affichée.

Conclusion

Le code C++ présenté ci-dessus est une solution efficace pour le problème du sac à dos 0-1. Il utilise la programmation dynamique pour trouver la solution optimale. Le code est facile à comprendre et à modifier pour différentes entrées.

Related Post