Dans ce cours, nous mettrons en oeuvre des méthodes pour résoudre des problèmes difficiles pour la complexité des calculs (NP-difficiles) lorsqu'on a absolument besoin d'une réponse en un temps raisonnable. Pour cela, il faut nécessairement abandonner certaines exigences sur la réponse fournie par l'algorithme. Il existe cependant des techniques pour obtenir des réponses exploitables à ces problèmes difficiles, telles que les algorithmes probabilistes, les algorithmes d'approximation, le branching. Nous illustrerons ces techniques sur plusieurs grands problèmes d'optimisation combinatoires qui se rencontrent fréquemment en pratique dans des contextes variés: la coupe minimum, l'équilibrage de charges, le problème du sac a dos, le stable maximum dans les graphes, la sélection de k centres et d'autres encore. Dans votre vie professionnelle, vous aurez probablement à résoudre certains de ces problèmes dans la conception d'applications. Ce cours vous donnera à la fois une familiarité avec les problèmes les plus courants mais aussi des techniques que vous pourrez mettre en oeuvre pour résoudre d'autres problèmes d'optimisation que vous rencontrerez.