diff --git a/src/main/java/fr/univamu/Main.java b/src/main/java/fr/univamu/Main.java
deleted file mode 100644
index 352079d911add55c5496f6a2e9140f0aaa022201..0000000000000000000000000000000000000000
--- a/src/main/java/fr/univamu/Main.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package fr.univamu;
-
-public class Main {
-
-}
\ No newline at end of file
diff --git a/src/main/java/fr/univamu/progav/Main.java b/src/main/java/fr/univamu/progav/Main.java
index 2b25ef7ba6d35c5ac4e1bedcb52e56e89a467d41..314cc54c5ede286a162bf30e323e1b84547b6029 100644
--- a/src/main/java/fr/univamu/progav/Main.java
+++ b/src/main/java/fr/univamu/progav/Main.java
@@ -1,8 +1,10 @@
 package fr.univamu.progav;
 
+import fr.univamu.progav.td2.DebuggerTutorial;
+
 public class Main {
 
   public static void main(String[] args) {
-
+    new DebuggerTutorial().exoDebug(); // TD2
   }
 }
diff --git a/src/main/java/fr/univamu/progav/td2/BackPackSolver.java b/src/main/java/fr/univamu/progav/td2/BackPackSolver.java
new file mode 100644
index 0000000000000000000000000000000000000000..eb8eacf296c4db94d7ec5f0fe0dd0780ec6fdfaf
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td2/BackPackSolver.java
@@ -0,0 +1,57 @@
+package fr.univamu.progav.td2;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class BackPackSolver {
+
+
+
+  private final List<Item> allItems;
+  private final List<Item> currentBackpack = new ArrayList<>();
+  private final int availableVolume;
+
+  public BackPackSolver(List<Item> allItems, int availableVolume) {
+    this.allItems = allItems;
+    this.availableVolume = availableVolume;
+  }
+
+
+  public List<Item> findBestValueBackpack(int nextItemIndex) {
+    if (nextItemIndex >= allItems.size()) {
+      return new ArrayList<>(currentBackpack);
+    }
+    List<Item> backpack1 = findBestValueBackpack(nextItemIndex+1);
+    int currentVolume = sumVolumes(currentBackpack);
+    if (currentVolume + allItems.get(nextItemIndex).volume > availableVolume) {
+      return backpack1;
+    }
+    currentBackpack.add(allItems.get(nextItemIndex));
+    List<Item> backpack2 = findBestValueBackpack(nextItemIndex+1);
+    return selectBestBackpack(backpack1, backpack2);
+  }
+
+
+
+  private List<Item> selectBestBackpack(List<Item> backpack1, List<Item> backpack2) {
+    int value1 = sumValues(backpack1);
+    int value2 = sumValues(backpack2);
+    return (value1 >= value2)? backpack1 : backpack2;
+  }
+
+  public record Item(String name,int volume, int value) {
+    @Override
+    public String toString() {
+      return name + " (Volume=" + volume + ", value=" + value + ")";
+    }
+  }
+
+  private static int sumValues(List<Item> backpack1) {
+    return backpack1.stream().mapToInt(Item::value).sum();
+  }
+
+  private int sumVolumes(List<Item> backpack) {
+    return backpack.stream().mapToInt(Item::volume).sum();
+  }
+
+}
diff --git a/src/main/java/fr/univamu/progav/td2/DebuggerTutorial.java b/src/main/java/fr/univamu/progav/td2/DebuggerTutorial.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2b9af97124f64df461ffce130b2a6b89fb93dd7
--- /dev/null
+++ b/src/main/java/fr/univamu/progav/td2/DebuggerTutorial.java
@@ -0,0 +1,37 @@
+package fr.univamu.progav.td2;
+
+public class DebuggerTutorial {
+
+  private int x = 2;
+  private String text = "an instance variable of a DebuggerTutorial instance";
+
+  public void exoDebug() {
+    double x = 1;
+    f();
+    A a = new A();
+    a.g();
+    for (int i = 0; i < 100000; i++) {
+      String s = "Reprendre l'exécution pour passer la boucle";
+    }
+    String r = "Si vous voyez ceci dans le débugger, c'est GAGNÉ";
+    System.out.println("The end.");
+  }
+
+  public void f() {
+    System.out.println("In method f.");
+    double x = 0;
+    String bad = "Si vous voyez ceci dans le débugger, c'est PERDU.";
+    double y = 0;
+  }
+
+  class A {
+    private final int x = 42;
+
+    public void g() {
+      String bad = "Si vous voyez ceci dans le débugger, c'est PERDU.";
+      System.out.println("In method g.");
+    }
+  }
+
+
+}
diff --git a/src/main/java/fr/univamu/progav/td2/TD2.md b/src/main/java/fr/univamu/progav/td2/TD2.md
index 2e59ad9204820d0990425302b44c86a6181b5ddc..e7e02046ecaa3cd1860782b178c1769f76574dfd 100644
--- a/src/main/java/fr/univamu/progav/td2/TD2.md
+++ b/src/main/java/fr/univamu/progav/td2/TD2.md
@@ -63,14 +63,55 @@ ayant appelé la méthode.
 Ces actions permettent d'exécuter le programme pas-à-pas, plus ou moins 
 finement, en inspectant les valeurs des variables. 
 
+
 Exercice 1
 ==========
 
+Ce petit exercice vous permet de prendre en main le débugger d'IntelliJ.
+
+- Vérifier que la méthode exécutable `main` de la classe `Main` (fichier `fr.
+univamu.progav.Main.java`) appelle bien la méthode `exoDebug` d'une instance de 
+  la classe `DebuggerTutorial` (sinon appeler l'enseignant).
+- Exécuter le programme (tâche gradle run). Le programme doit afficher :
+```
+In method f.
+In method g.
+The end.
+```
+- Placer un *breakpoint* sur la première 
+  ligne de la méthode 'main' (comment ? lire ci-dessus). Relancer le programme 
+  en mode debug (bouton ![debug](../../../../../resources/debug.png) en haut 
+  à droite). À l'issue de la compilation, vous obtiendrez l'ouverture de la 
+  vue du debugger.
+- Inspecter l'objet `this`. Quelles sont ses propriétés et leurs valeurs ? 
+  Ceci correspond-il bien au programme écrit ?
+- Avancer l'exécution d'une instruction 
+  ![Passer](../../../../../resources/step-over.png). Quel est l'effet de 
+  l'instruction ? 
+- Entrer dans l'exécution de la méthode `f`
+  ![Entrer](../../../../../resources/step-into.png). Combien la pile 
+  a-t-elle de couches ? Quelles sont les valeurs de la variable `x` dans les 
+  différentes couches de la pile ?
+- Ressortir de la méthode `f`
+  ![Sortir](../../../../../resources/step-out.png). Exécuter l'instruction 
+  créant une instance de la classe `A` et vérifier son effet sur la mémoire. 
+  Quelle est la référence du nouvel objet ?
+- Sauter l'appel de la méthode `g`
+  ![Passer](../../../../../resources/step-over.png).
+- Ajouter un breakpoint après la boucle, puis reprendre l'exécution du 
+  programme ![Reprendre](../../../../../resources/resume.png).
+- Continuer jusqu'à voir le message de victoire dans le débugger. Sinon 
+  recommencer.
+
+
+Exercice 2
+==========
+
 Dans la classe `People`, la méthode `whereIsCharlie` devrait retourner la 
 position de Charlie, 25 ans, dans la liste. Utiliser le test et le débuggeur 
 pour trouver l'erreur.
 
-Exercice 2
+Exercice 3
 ==========
 
 Dans la classe `ASimpleLoop`, la méthode `nonTerminatingSum` fait un calcul, 
@@ -78,7 +119,7 @@ qui ne termine pas. Utiliser le test et le débuggeur, pour comprendre
 pourquoi elle ne termine pas. Corriger ensuite la méthode pour que le calcul 
 s'arrête,
 
-Exercice 3
+Exercice 4
 ==========
 
 Dans la classe `Ratio`, représentant les nombres rationnels, l'addition ne 
@@ -94,7 +135,7 @@ tester l'égalité des numérateurs et des dénominateurs. Utiliser la méthode
 de test et le débuggeur pour trouver l'erreur et la corriger. 
 
 
-Exercice 4
+Exercice 5
 ==========
 
 La classe `GuessingGame` reprend la stratégie optimale pour le jeu 
diff --git a/src/test/java/fr/univamu/progav/td2/BackPackSolverTest.java b/src/test/java/fr/univamu/progav/td2/BackPackSolverTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..d872eeba853abef96ce403ec08d69c917b202dfe
--- /dev/null
+++ b/src/test/java/fr/univamu/progav/td2/BackPackSolverTest.java
@@ -0,0 +1,32 @@
+package fr.univamu.progav.td2;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.List;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+class BackPackSolverTest {
+
+
+  private final static List<BackPackSolver.Item> ITEMS =
+    List.of(
+      new BackPackSolver.Item("Alfa",5,8),
+      new BackPackSolver.Item("Bravo",4,7),
+      new BackPackSolver.Item("Charlie",4,6),
+      new BackPackSolver.Item("Delta",3,4),
+      new BackPackSolver.Item("Echo",2,3)
+    );
+  public static final int AVAILABLE_VOLUME = 10;
+
+  @Test
+  void findBestValueBackpack() {
+    BackPackSolver bp = new BackPackSolver(ITEMS, AVAILABLE_VOLUME);
+    List<BackPackSolver.Item> selection = bp.findBestValueBackpack(0);
+    int totalVolume = selection.stream().mapToInt(BackPackSolver.Item::volume).sum();
+    int totalValue = selection.stream().mapToInt(BackPackSolver.Item::value).sum();
+    assertTrue(totalVolume <= AVAILABLE_VOLUME);
+    assertEquals(16,totalValue);
+    assertEquals(3,selection.size());
+  }
+}
\ No newline at end of file