A725. Huit sacs A7. Problèmes de pesées Problème proposé par Augustin Genoud
Huit sacs, A, B, C, D, E, F, G et H, contiennent chacun 100 billes. Six sacs ont uniquement des billes de 10 g. Un sac ne contient que des billes de 11 g et un autre sac ne renferme que des billes de 9 g. Afin de déterminer le poids des billes de chaque sac, on extrait a billes du sac A, b billes du sac B, c billes du sac C, d billes du sac D, etc.
Ensuite, on procède à une seule pesée en mettant l’ensemble des billes extraites sur une balance électronique.
Par convention et sans perte de généralité, on retient 0 ≤ a ≤ b ≤ c ≤ …. ≤ h.
Déterminer le nombre de billes qu'il convient d'extraire de chaque sac dans les deux cas suivants :
- le nombre total de billes sorties des sacs est le plus petit possible.
- le terme h est le plus petit possible ? Solution de Paul Voyer
Il existe A82 56configurations possibles de l'ensemble des sacs.
Si on utilise une séquence { a, b, c, d, e, f, g, h}, p billes de 11 g alourdissent de p g, et q billes de 9 g allègent de q g, par rapport à ce que feraient des billes de 10 g.
On cherche 8 valeurs a,b,c,d,e,f,g,h dont les différences deux à deux pourront prendre
2 28
8
C valeurs distinctes, le signe de l'écart entre le résultat de la pesée et
10(a+b+c+d+e+f+g+h) précisant lequel des 2 sacs identifiés a des billes de 11 g et lequel a des billes de 9 g.
Une première méthode utilise l'ensemble {0,1,2,4,8,16,32,64}, pour laquelle l'écart de pesée est de la forme 2p-2q, avec la convention 2-1=0, ce qui permet d'identifier les sacs N°p+2 (11) et N°q+2 (9).
Mais elle utilise 127 billes et h=64, valeurs non optimales.
(N.B. Cette première méthode est aussi une règle de Golomb d'ordre 8, voir la suite).
De meilleurs résultats sont obtenus avec les règles de Golomb d'ordre 8, adaptées au problème.
https://fr.wikipedia.org/wiki/Règle_de_Golomb http://oeis.org/A079423
Une règle de Golomb est une règle munie de marques à des positions entières, telle que deux paires de marques ne soient jamais à la même distance ; en d'autres termes, chaque couple de marques mesure une longueur différente des autres.
Une table (à construire en fonction de la règle, voir annexe 1) permet de désigner le sac 11 et le sac 9 en fonction du résultat de la pesée.
Pour définir une règle de Golomb qui minimise le nombre de billes à sortir des sacs, on a dû écrire un programme VBA (annexe 2).
La règle trouvée est {0,1,3,8,14,18,30,39}, de somme 113.
Il faut sortir 113 billes dont 39 du sac le plus chargé .
Une règle de Golomb est dite optimale si elle sa longueur h est minimale.
Il n'existe qu'une règle optimale d'ordre 8 {0,1,4,9,15,22,32,34}, elle a pour longueur h = 34, et la somme de ses termes vaut 116,
(et la règle symétrique {0,2,12,19,25,30,33,34}, de somme =155, de ce fait moins intéressante).
Il faut sortir 116 billes dont 34 du sac le plus chargé .
Annexe 1
Table d'identification des sacs en fonction de la pesée, nombre minimum de billes.
écart pesée-1130
N° du sac de 9
N° du sac de 11
-44 8 1
-43 8 2
-41 8 3
-37 8 4
-32 8 5
-30 7 1
-29 7 2
-27 7 3
-24 8 6
-23 7 4
-20 6 1
-19 6 2
-18 7 5
-17 6 3
-14 8 7
-13 6 4
-12 5 1
-11 5 2
-10 7 6
-9 5 3
-8 6 5
-7 4 1
-6 4 2
-5 5 4
-4 4 3
-3 3 1
-2 3 2
-1 2 1
1 1 2
2 2 3
3 1 3
4 3 4
5 4 5
6 2 4
7 1 4
8 5 6
9 3 5
10 6 7
11 2 5
12 1 5
13 4 6
14 7 8
17 3 6
18 5 7
19 2 6
20 1 6
23 4 7
24 6 8
27 3 7
29 2 7
30 1 7
32 5 8
37 4 8
41 3 8
43 2 8
44 1 8
Table d'identification des sacs en fonction de la pesée, h mimimum.
écart pesée-1160
N° du sac de 9
N° du sac de 11
-34 8 1
-33 8 2
-32 7 1
-31 7 2
-30 8 3
-28 7 3
-25 8 4
-23 7 4
-22 6 1
-21 6 2
-19 8 5
-18 6 3
-17 7 5
-15 5 1
-14 5 2
-13 6 4
-12 8 6
-11 5 3
-10 7 6
-9 4 1
-8 4 2
-7 6 5
-6 5 4
-5 4 3
-4 3 1
-3 3 2
-2 8 7
-1 2 1
1 1 2
2 7 8
3 2 3
4 1 3
5 3 4
6 4 5
7 5 6
8 2 4
9 1 4
10 6 7
11 3 5
12 6 8
13 4 6
14 2 5
15 1 5
17 5 7
18 3 6
19 5 8
21 2 6
22 1 6
23 4 7
25 4 8
28 3 7
30 3 8
31 2 7
32 1 7
33 2 8
34 1 8
Annexe 2 Macro excel
Sub Macro1() '
' Macro1 Macro '
' huit sacs
Dim delta(120) As Integer Dim taquet(7) As Integer sommemax = 120
' la somme doit faire moins de 116 (règle optimale 116/34) taquet(0) = 0
For i = 1 To 2
taquet(1) = i
delta(i) = 1 ' cette valeur est portée occupée
For j = i + 1 To 15
If delta(j - i) = 1 Then GoTo nextj taquet(2) = j
delta(j) = 1 delta(j - i) = 1
For k = j + 1 To (120 - i - j) / 5 If delta(k) = 1 Then GoTo nextk If delta(k - i) = 1 Then GoTo nextk If delta(k - j) = 1 Then GoTo nextk taquet(3) = k
delta(k) = 1 delta(k - i) = 1 delta(k - j) = 1
For l = k + 1 To (120 - i - j - k) / 4 If delta(l) = 1 Then GoTo nextl If delta(l - i) = 1 Then GoTo nextl If delta(l - j) = 1 Then GoTo nextl If delta(l - k) = 1 Then GoTo nextl taquet(4) = l
delta(l) = 1 delta(l - i) = 1 delta(l - j) = 1 delta(l - k) = 1
For m = l + 1 To (120 - i - j - k - l) / 3 If delta(m) = 1 Then GoTo nextm If delta(m - i) = 1 Then GoTo nextm If delta(m - j) = 1 Then GoTo nextm If delta(m - k) = 1 Then GoTo nextm If delta(m - l) = 1 Then GoTo nextm taquet(5) = m
delta(m) = 1 delta(m - i) = 1 delta(m - j) = 1 delta(m - k) = 1 delta(m - l) = 1
For n = m + 1 To (120 - i - j - k - l - m) / 2 If delta(n) = 1 Then GoTo nextn
If delta(n - i) = 1 Then GoTo nextn If delta(n - j) = 1 Then GoTo nextn If delta(n - k) = 1 Then GoTo nextn If delta(n - l) = 1 Then GoTo nextn If delta(n - m) = 1 Then GoTo nextn taquet(6) = n
delta(n) = 1 delta(n - i) = 1 delta(n - j) = 1 delta(n - k) = 1 delta(n - l) = 1 delta(n - m) = 1
For p = n + 1 To 117
If delta(p) = 1 Then GoTo nextp If delta(p - i) = 1 Then GoTo nextp If delta(p - j) = 1 Then GoTo nextp If delta(p - k) = 1 Then GoTo nextp If delta(p - l) = 1 Then GoTo nextp If delta(p - m) = 1 Then GoTo nextp If delta(p - n) = 1 Then GoTo nextp taquet(7) = p
delta(p) = 1 delta(p - i) = 1 delta(p - j) = 1 delta(p - k) = 1 delta(p - l) = 1 delta(p - m) = 1 delta(p - n) = 1
' on a trouvé une règle ' est-elle la meilleure ?
somme = i + j + k + l + m + n + p
If somme > sommemax Then GoTo nextp1 sommemax = somme
For ndex = 1 To 8
Range("A" & ndex).Value = taquet(ndex - 1) Next ndex
Range("A10").Value = sommemax Range("b1:b117").Clear
Count = 0
For ndex = 1 To 120 'vérifier combien de valeurs, devrait faire 28.
Ccount = Ccount + delta(ndex) Next
Range("A14").Value = Ccount For ndex = 1 To p
If delta(ndex) = 1 Then Range("B" & ndex).Value = ndex Next ndex
' Stop debug nextp1:
delta(p) = 0 delta(p - i) = 0 delta(p - j) = 0 delta(p - k) = 0 delta(p - l) = 0
delta(p - m) = 0 delta(p - n) = 0 nextp:
Next p
delta(n) = 0 delta(n - i) = 0 delta(n - j) = 0 delta(n - k) = 0 delta(n - l) = 0 delta(n - m) = 0 nextn:
Next n
delta(m) = 0 delta(m - i) = 0 delta(m - j) = 0 delta(m - k) = 0 delta(m - l) = 0 nextm:
Next m
delta(l) = 0 delta(l - i) = 0 delta(l - j) = 0 delta(l - k) = 0 nextl:
Next l
delta(k) = 0 ' on libère les valeurs qu'occupait k delta(k - i) = 0
delta(k - j) = 0 nextk:
Next k
delta(j) = 0 delta(j - i) = 0 nextj:
Next j
Next i
Stop ' pour voir les valeurs debug End Sub