Bonjour,
J'ai un petit problème à vous soumettre...
J'ai écrit une petit boucle qui me liste toutes les combinaisons de 3 valeurs (entiers positifs) telles que la somme de ces 3 valeurs est toujours égale à une autre valeur donnée:
Soit i1 + i2 + i3 = iMax dans tous les cas
(slCombinaisons est un TStringList global)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 procedure ListerCombinaisons; var s: string; i1, i2, i3, iMax: integer; begin iMax := 4; // Par exemple for i1 := 0 to iMax do begin for i2 := 0 to (iMax - i1) do begin i3 := iMax - i1 - i2; s := Format('%2d-%2d-%2d', [i1, i2, i3]); slCombinaisons.Add(s); end; end; end;
Cet exemple va me donner la liste suivante:
i1 | i2 | i3 | (Index)
0 0 4 | 0
0 1 3 | 1
0 2 2 | 2
0 3 1 | 3
0 4 0 | 4
1 0 3 | 5
1 1 2 | 6
1 2 1 | 7
1 3 0 | 8
2 0 2 | 9
2 1 1 | 10
2 2 0 | 11
3 0 1 | 12
3 1 0 | 13
4 0 0 | 14
La suite est logique, l'ordre est toujours le même.
Maintenant je voudrais, *par le calcul* (et pas en consultant la liste !):
1- déterminer le nombre total de combinaisons (en fonction de iMax). Dans cet exemple, le résultat est 15.
2- connaissant i1, i2, i3 (et iMax), déterminer la position de leur combinaison dans la liste (Index). Par ex. avec les valeurs 1 1 2 le résultat doit être 6.
3- connaissant la position dans la liste (Index) et iMax, calculer i1, i2, i3. Par ex. avec un Index de 9 le calcul doit me donner i1=2, i2=0 et i3=2.
Encore une fois, ceci sans boucler sur la liste elle-même, mais seulement à partir des valeurs connues.
Mais je n'y arrive pas, ça fait des heures que je me prends la tête dessus ! Donc si quelqu'un y voit plus clair que moi...
PS: si une façon de lister différente permet de faciliter les calculs, ça ne me dérange pas de modifier ma façon de faire.







Répondre avec citation





Partager