Académique Documents
Professionnel Documents
Culture Documents
Si la limite de poids de votre sac à dos est de 10 kg, quelle est la solution
optimale ? C'est-à-dire, quels articles devriez-vous emporter avec vous ?
Dans ce cas, la solution est claire. On prendrait le deuxième et le dernier article,
obtenant une valeur de 130 FCFA tout en respectant exactement la limite de
poids. Nous atteignons la valeur maximale possible sans violer la contrainte du
problème.
Cependant, l'évaluation de toutes les possibilités est très peu pratique en
général, c'est pourquoi nous aimerions savoir s'il existe une meilleure façon
d'aborder ce problème. En fait, il y en a un, et nous verrons un algorithme dans
la suite.
problème
gina voyage avec Tom dans le désert, et elle portera toute leur nourriture. Elle
peut porter un maximum de 9,5 kg et a 5500 cm3 de provisions dans son sac.
Gina peut choisir parmi les fournitures suivantes :
Quel est le plus grand nombre de calories qu'elle peut apporter avec elle,
compte tenu de ses contraintes ?
NB: Gina peut en apporter autant qu'elle le désire pour chacun des articles ci-
dessus.
Résolution du problème
Table1
t[i − 1, j] 𝑠𝑖 𝑤𝑖 ˃𝑗
t[i,j] ={
max(𝑡[𝑖 − 1, 𝑗], 𝑡[𝑖 − 1, 𝑗 − 𝑤𝑖] + 𝑣𝑖) 𝑠𝑖 𝑤𝑖 ≤ 𝑗.
Pour trouver la plus grande valeur possible, il suffit d'obtenir t[n,W] (c'est-à-
dire la valeur maximale possible en utilisant les n articles de notre liste alors
que le poids total est inférieur à la capacité W de notre sac.
Théorème :
Dans ce problème, nous employons une matrice de hauteur n et de largeur w,
et notre algorithme passe par chaque cellule une fois, ce qui fait n×w
opérations au total. Par conséquent, la complexité du problème du sac à dos
est O(n×w).
Algorithme avec python
# n:number of items
# v[i]:value of the i-th item, w[i]: weight of the i-th item
# W = backpack capacity
knapsack(n,v,w,W)
for j=0 to j=W
t[0, j]=0
for i=1 to n
for j=0 to W
if w[i]>j
t[i, j]=t[i - 1, j]
else
t[i, j] = max(t[i - 1, j], t[i - 1, j - w[i]]+v[i])
return t[n][W]
Tableau 2
t=[i-1,j]= t[0,4]=0
et que
t=[i-1,j-w[i]]+vi= t[0,0]+vi=0+5=5.
Tableau 3
t=[i,j]= t=[2,8]=10
En faisant la même chose jusqu'à ce que nous terminions la rangée, nous
obtenons
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 5 5 5 5 5 5 5
2 0 0 0 0 5 5 5 5 10 10 10
3
4
5
Tableau 4
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 5 5 5 5 5 5 5
2 0 0 0 0 5 5 5 5 10 10 10
3 0 0 0 3 5 5 5 8 10 10 10
4 0 0 0 3 5 5 5 8 10 10 10
5
Tableau 5
0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 5 5 5 5 5 5 5
2 0 0 0 0 5 5 5 5 10 10 10
3 0 0 0 3 5 5 5 8 10 10 10
4 0 0 0 3 5 5 5 8 10 10 10
5 0 0 3 3 5 6 8 8 10 11 13
La valeur maximale que nous pouvons obtenir est t=[n,W] t=[5,10]=13, ce qui
peut être obtenu en utilisant le deuxième et le dernier élément. En faisant cela,
le poids total sera de 10 (C'est égal à la capacité, qui est de 10) et la valeur
totale sera de 13.
Voici un exemple de code que vous pouvez utiliser pour résoudre le problème :