Partition équilibrée (1)

Si les éléments d'une liste de longueur \(n\) sont répartis entre deux listes liste_1 et liste_2 de longueurs respectives \(n_1\) et \(n_2\), (\(n_1+n_2=n\)), on dit que liste_1 et liste_2 réalisent une partition de la liste initiale.

On dispose d'une liste de \(n\) nombres entiers strictement positifs, et on souhaite répartir ces \(n\) nombres en deux listes telles que les sommes respectives des éléments des deux listes soient les plus proches possibles.

Cette partition d'une liste en deux listes s'appelle une partition équilibrée.

Par exemple, avec la liste [10, 8, 5, 7, 9, 5], une partition équilibrée est obtenue avec les deux listes [10, 7, 5] et [8, 9, 5].

Malgré sa facilité d'énonciation, ce problème est complexe. On utilise dans cet exercice un algorithme glouton pour le résoudre :

  • on trie la liste initiale liste par ordre décroissant ;

  • on crée deux listes vides liste_1 et liste_2 ;

  • on ajoute successivement chaque nombre de la liste triée liste à la liste liste_1 ou liste_2 en choisissant à chaque fois celle dont la somme des éléments est la plus petite. En cas d'égalité des sommes, on ajoute le nombre à la liste liste_1.

Cette approche gloutonne est facile à mettre en œuvre mais elle n'est pas toujours optimale. Elle peut en effet générer des listes dont les sommes sont proches mais pas les plus proches possibles. Pour obtenir une solution optimale dans tous les cas, on peut utiliser une méthode par programmation dynamique, (voir exercice partition equilibrée 2 )

1er exemple : solution optimale

On considère la liste [10, 8, 5, 7, 9, 5]. La liste triée est [10, 9, 8, 7, 5, 5].

Les insertions successives sont décrites ci-dessous :

Valeur insérée liste_1 liste_2 Remarque
État initial [] []
10 [10] [] Insertion dans liste_1
9 [10] [9] Insertion dans liste_2
8 [10] [9, 8] Insertion dans liste_2
7 [10, 7] [9, 8] Insertion dans liste_1
5 [10, 7, 5] [9, 8] Insertion dans liste_1
5 [10, 7, 5] [9, 8, 5] Insertion dans liste_2

Les deux listes [10, 7, 5] et [9, 8, 5] ont la même somme totale de 22. La solution est donc optimale.

2nd exemple : solution non optimale

On considère désormais la liste [3, 3, 3, 4, 5]. La liste triée est [5, 4, 3, 3, 3].

Les insertions successives sont décrites ci-dessous :

Valeur insérée liste_1 liste_2 Remarque
État initial [] []
5 [5] [] Insertion dans liste_1
4 [5] [4] Insertion dans liste_2
3 [5] [4, 3] Insertion dans liste_2
3 [5, 3] [4, 3] Insertion dans liste_1
3 [5, 3] [4, 3, 3] Insertion dans liste_2

Les deux listes [5, 3] et [4, 3, 3] ont des sommes différentes : 8 pour liste_1 et 10 pour liste_2.

Cette solution n'est pas optimale. La réponse optimale serait [5, 4] et [3, 3, 3] qui donnent des sommes égales à 9.

Compléter le code de la fonction partition qui prend en paramètre une liste de nombres nommée liste et qui renvoie le tuple composé des deux listes liste_1 et liste_2 obtenues par l'algorithme glouton décrit plus haut.

La liste passée en paramètre est triée à l'aide de la méthode sort. La valeur du paramètre reverse est fixée à True afin d'effectuer un tri suivant l'ordre décroissant.

Exemples
>>> liste = [10, 8, 5, 7, 9, 5]
>>> partition(liste)
([10, 7, 5], [9, 8, 5])
>>> liste = [5, 4, 3, 3, 3]
>>> partition(liste)
([5, 3], [4, 3, 3])
>>> liste = [5, 4]
>>> partition(liste)
([5], [4])
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013s3_8ufvIy n7aêSû1me(P24C:twi][h)6o;bcdUgM/T0lqp.r-,=+k95Rxé050M0t0A0n0C0T0b0k0L0T0n0b0b0!010A0C0V010406050b0f0s0s0n0X0j040p0I0T0f0 0I0l0k020n0s0V0J0k0)0t190X0U0f0t0b050Q16181a1c140V041A1H051K0Q1K1M1H140M0C0h0@0_0{0}0F0C0O0F0T1!0F0A12050/0K0T0t1V0`0|011Z1#1%1#0A1-1/1+0A0K0I0M1c1,0X1I0A0F0@1f0b0V0n0l0}0w011;1X010g0;0t0l1n0t1+2c2e2j1?2m1/2p0s2r040a0k0v0X0I0V0I0b0C1i1k0-2a0X0X0t0L2M1A2t0l1I0Q282Y0A2625270M2v0}1%0l2o2J1+1S1U0^1=2,0C2.0l221T1+0V2R1I2W2Y33152d1k2@2k2|0X190T120k0r2V3713362u391?3b3d3f0w3i2e3k2W2+013p0n3e040k0c3t2X143w3n0}3z3B0k0x3F3v373x3L3f0(3P3H3R3J3y0I3c3A3f0H3W3l381W3o3#3q3C0m3*3I3-3K3/3%3C0e3?3Y3^3!3$3M0%3~3m403T040r0S453,2^413:0r3h1B3j3X464e480r3s4j3u4l4d3a3`3B0r3E4r3G3+3S4w120r3O4A2Y300t2Y2=2#0M2)3x0L222B0,1T1I4K323j3P054S0-4Z4m2k0$120-0g4#3@4e0B3f4:3 4n0g122d0X0 2U4I4C3Z11040u4^4*3o121%0b0A0t574u1?540G0z3W0k5m0k52475a0C5c5e514;2k0I120W5f3S120b3#0A5B5312565v4_3a122R0h0t0X0b5u355w1?5y040!5H400$0L120R0X1x5#4e5i5l5n5p4n5r5t0d4i335o5W0}5Y5!4I5|5M5h120E0D5:5m5=5N045b5d0d4q5{6a5X12606h5}0154666862583K5D0I180t5_3P6s5g5~6k6A6i0}0s0C124b4I065n6B5C045E6x6f6F6n5 6V636H6J046L336N5;6n4,040g3#6Y6t3y120*6:6C010I4?042`6^6Q6d5U4!6n545k6M6O6O6G016,0C4/617a0l6v6T5`3j6P3Z5Y020T0A0J6l7l7g7i2A6U5L6;756r786*6Z6=6c5s6e7k3u7a5Y5A7z6_7h040n0V0V2o0M5-2k545K5V7F7R6@7P3x5/777D787v6R6w7x7K2X7m406X7f6n7R6S7?6 7n120#815q047)6(7.7_4e6,0t0=727L741276898a7E6;7R717y7$6;7N7Y597S7U7W8v0}7!8A7G88737F7,8l8m8b6b7 6y6g7u6W6E7|7%7w8O854e5Y848T8o6?6r7a6,2R0A0f0X0l8X6b8q7@4)6_540Z8:8w8q8P4s1A4%4L1J311A4N1A0A4P972%2Z21232#0n1.920Q4N1G8@3x2R0s0d0g0n0$6y0F0c121s1u1w1y0k8k4!1N3k1H0y7=1:2`1S1w0+1:0T003A0O3#2L0F2A0k0O0T0I1h1j0k1h0;5s0+0k0C0L0C0k2.0k0M1j9=2d0?0f9=0X0+2I0l5T0k2H0 3d1:0M2e0?0A9#0?1/0?0L0`7O1Q1L040N9}9 1ja2a40Ca60k7V1h0k0o2$1:0I0K5d0l1x9?a90kab0fad9Bag0?0n5Q0L9(9=0s0+284Tau1aau2G0O0X1n192M9?0j2z0C9Aai9G040i0T0k1y0Aau2J2K9h9?009)5b5R0k0_0k6.0l2T0C9%2p0 5Q5o916R17904T040Z2a6xaGa1b41:910@0C0Y0-0{ac76aj2=3x1^1$1(1*9m3Z2x2o2q122D0p0L0X10a`0v0jaW8/514Y3+344!bg8)4-0t7e8s6_6|5o7*3Z0l4{044}4 babXb,7+5J8D8p7I8g2X7a5i9D4s797}5@5d8D8ub:865E4~8D8Cce5?045P5R5Tcc8Sb|3Z5%5)5+c2bI408I4kc88U7H5^8?8L6j5Z8{8B65677-69c9cE6e8~7^7Mcr8Q8HcM8(6+126.0XcK8Ec)6{126~8#7Qcacxc48j7C8n6_7cb+cX8o0K5Dbick7Zb~d28|c16zd5cL040Gc+127p7r7t3ucH3Kc bh0scid4cs868}dodbc63G8KcPcD8=cq047Odqcl7T7V0l7Xd96odp8G8$87dtdccO7/c#048ecpdK7BdS8a7:dsdKcddE6bdG8zdYdM8hcD8Fd:7A12dR8Jdj7b5O0.8-b{c}c:cR6y8?c?blc)c05^cT3k0Qb%1N949j4W9l0P0:0?a8bq0Lbs0`bm1/2a0qa`0-0h0C2oa`1w0n0Ma%0 9Aa^1kb7b99%0M0f9;6w0K2Ra 0+0T0+2A0l0AaO9!5S0k1w9RaQb40n0k5E1ga*302H2J9Obreua`a_b42`0+0:2Ra:149j0.0:0=04.