Salut,
sinon, on peut s'en sortir a l'arrache.
soit x_1 le nombre de batteur type 1
soit x_2 le nombre de batteur type 2
soit w_1 le poids du batteur type 1 (40kg)
soit w_2 le poids du batteur type 2
On part de l'hypothèse que si on a

avec S la somme qu'on cherche, alors
w_1+(x_2+j)w_2 > S')
cad si on ajoute des pieces en plus ca donne pas une solution (puisque plus de perte).
On cherche le nombre de pieces x_1 toute seule qui realisent une solution.
Idem pour x_2.
Apres, on regarde ce qu'il se passe si on enleve une piece a x_1, la somme est-elle valide ( supérieure a S?), puis on recommence.
En pseudo code, ca peut donner qqch comme ca :
- Code: Tout sélectionner
TrouverSolution(reel w_1,reel w_2,reel Somme) : (entier x_1,entier x_2)
debut
x_1 := Somme/w_1 + 1 //moyennant le modulo pour faire au plus juste
x_2 := Somme/w_2 +1
retourner (x_1,x_2)
fin
- Code: Tout sélectionner
TrouverOptimale(entier x_1, entier x_2, reel w_1,reel w_2,reel SommeCourante,reel SommeTotale)
debut
n_1: entier//nombre de Bateur 1Courant
n_2: entier //nombre de Bateur 2Courant
v_1:=x_1 : entier //la solution de base
v_2:=x_2 : entier
somme:reel // une variable temporaire
pour i:=1 a x_1 faire
n_1:=(x_1-i);
si (n_1w_1 + x_2w_2 < SommeTotale) //si on est sous la sommeTotale inutile denlever a n_2
alors Sortir de la boucle
finsi
pour j:= 1 a x_2 faire
n_2:=x_2-j
somme:=n_1w_1+n_2w_2
si (somme <SommeTotale) //si on est dessous, inutile denlever a n_2
alors Sortir de la boucle
sinon
si somme<SommeCourante //alors on a une meilleure solution
sommeCourante:=somme
v_1:=n_1
v_2:=n_2
finsi
finsi
Afficher(v_1,v_2)
fin