Rendu de monnaie (3)

Le but de cet exercice est de déterminer le nombre minimal de pièces à utiliser pour rendre un certain montant m (qui est ici un nombre entier) à un client. On suppose que l'on dispose d'un nombre illimité de chaque type de pièces. La présence de pièces de valeur 1 garantit que l'on peut toujours trouver les pièces pour un montant donné.

Systèmes monétaires et algorithme glouton

Deux exercices proposent des solutions utilisant un algorithme glouton (Rendu de monnaie et Rendu de monnaie (récursif)), qui consiste à toujours rendre d'abord les pièces de plus grande valeur.
Prenons l'exemple où les pièces possibles ont pour valeur 1, 4 et 6. Avec un algorithme glouton rendre 8 nécessite trois pièces : une de 6, et deux de 1. Ce n'est pas la solution attendue car on peut utiliser seulement deux pièces de 4. L'algorithme glouton donne la meilleure réponse seulement dans le cas où le système monétaire (les pièces ou billets que l'on peut utiliser) est dit canonique. Ce n'est pas forcément le cas dans cet exercice.

Pour un montant \(m\), on peut rendre une pièce de valeur \(p\) avec \(p \leq m\) et le montant \(m - p\). Pour résoudre le problème pour un montant \(M\), nous allons résoudre tous les problèmes pour tous les montants \(m\) allant de \(1\) à \(M\) compris. Nous utiliserons un tableau memo pour mémoriser les résultats calculés. memo[i] est le nombre minimal de pièces à rendre pour un montant i.

  • memo[m] sera donc égal au nombre \(1\) auquel on ajoute le plus petit des résultats memo[m - p] avec p valeur d'une pièce inférieure ou égale à m.
  • On peut initialiser memo avec pour tout entier i : memo[i] = i. En effet memo[0] = 0, et pour tout i strictement positif, on peut rendre i pièces de valeurs \(1\).

Compléter la fonction rendu_monnaie qui prend en paramètres un entier montant représentant le montant à rendre et la liste pieces représentant la liste des pièces utilisables, qui renvoie le nombre minimal de pièces à utiliser pour rendre ce montant.

... peut représenter plusieurs lignes de code.

###(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

.128013s3Oo_;èbcdufvg/lyàq n7aïpS.r1L-meh,(P2=4:+twki][5R)é6050k0H0R0x0U0q0b0u0j0q0x0b0b0N010R0U0z010406050b0l0G0G0x0C0r040A0e0q0l0_0e0v0u020x0G0z0g0u0Y0H130C0t0l0H0b050p101214160~0z041u1B051E0p1E1G1B0~0k0U0n0.0:0=0@0I0U0o0I0q1U0I0R0|050)0i0q0H1P0;0?011T1V1X1V0R1%1)1#0R0i0e0k161$0C1C0R0I0.190b0z0x0v0@0M011+1R010m0+0H0v1h0H1#26282d1-2g1)2j0G2l040a0u0L0C0e0z0e0b0U1c1e0%240C0C0H0j2G1u2n0v1C0p222S0R201 210k2p0@1X0v2i2D1#1M1O0/1,2$0U2(0v1|1N1#0z2L1C2Q2S2}0 271e2.2e2?0C130q0|0D2P310}302o331-35370|0M3b283d2Q2#013i0x38040c3m2R0~3p3g0@3s3u0O3x3o313q3D0|0X3G3z3I3B3r0e363t0|0#3N3e321Q3h3S3j040w3G1D2{1u2,2V0k2Z3q0j1|2v0$1N1C2`0H2|3c3*3?0%3~3f3!0@0T0|0%0m3*3A45010S0|0u4b3P4d0v0m0|2L0v0k0l0f0G1d2j0U0H4i442/010{040K4y3Z4A0v0|4t0v0)4L4F3q4C0J3G4h4c4H0|0z4w0j1s4O3Q4C0Z0P3N0u4+4T4j4V042u4t4S3Y3q0e0|0N4?4U2e4C0W4#4k4J4|4.2e47040m3S544z34531v3c4-5c1-0e4f042;5b4G340i4n280o4x5f3n4@4$0|4E5w2R5y524:1d4M0R5o4^0|0Q5K3Q0G0U39514A4%0V4*4,5E4A57590C5O5F0G5(4A5k0|5n5C045h5p3h5r040C5t5v2 4}1-4C5B5}551-5Q5S5:5Z4~0|4R5:5=3J4J5H285J6c685j5M5+2e65043a675~0@4%4)5:064,6z6d3Q5#5a6j6t3r4W4Y5|5g6k0@5-5m0v6n3h6I2M4!6s636u0|6w2}6y6A6%6M01570U4a6F6X6H044X6U6R6N0|020q0R0g4{6.5i3C5e2}6B4d6O280k6@6:4;0e5T6904506W707a794_040F794I6;6J7d5 0|5W6 5?6^045N7w3q6p6r736)7l6`6|7o4J1n7c7h7x4B0|7g627i7p5*7O4P7u6!3c6$6%7%744/7b7s6Y7f7,7j7X5z047v7F6G7l6~7^6/7V7M7/4 7/7V7k0|7n7B3Q7p6=4Z807u847z797D5X4+6)572L0R0l0C6Q875)7 7;4d818u7*6g4N8x7e7@7#1u413}3+8H0p3.1u0R3:8M2X2T1{1}2V0x1(8J3.1A437P2L0G0f0m0x0T0H0f0I0c0|1m1o1q1s0u7!5x1H3d1B0d1e0x0u0U0j0U0u1b0+0U0b0!958 0q0o3S2F0I2u910R0!5`0_0m0u2I2`0e0o5`1x2G9p0r2t0U8?0u0i0;9a100C0u1)0u2`2;930z1*1{1?0e0G0F0l0z0u0K2I9D0-2i0u0I0x1b0Z0B0u068~0u900s0.9(9B0!0)9O9K143?8o0l0u0R0e0l0-1)0-0ba30b0F9r1(0h2u0-1q940b1*0j0I0H0n9)al2i0R9Ka39Ha69p6,0m9lar0-4K5I0-058G4:ab8F3@049,060E900G0!4t0y0b0x9w0x0n2M9ba18V1)9)0u2?a49:9K0H36989p000!0n2Fa/9p8@0j3t0j0l0,0u2L0k1d0k6h0b0B1D3d8K0(0*0,04.

###(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

.128013s3Oo_;èbcdufvg/lyàq n7aïpS.r1L-meh,(P2=4:+twki][5R)é6050k0H0R0x0U0q0b0u0j0q0x0b0b0N010R0U0z010406050b0l0G0G0x0C0r040A0e0q0l0_0e0v0u020x0G0z0g0u0Y0H130C0t0l0H0b050p101214160~0z041u1B051E0p1E1G1B0~0k0U0n0.0:0=0@0I0U0o0I0q1U0I0R0|050)0i0q0H1P0;0?011T1V1X1V0R1%1)1#0R0i0e0k161$0C1C0R0I0.190b0z0x0v0@0M011+1R010m0+0H0v1h0H1#26282d1-2g1)2j0G2l040a0u0L0C0e0z0e0b0U1c1e0%240C0C0H0j2G1u2n0v1C0p222S0R201 210k2p0@1X0v2i2D1#1M1O0/1,2$0U2(0v1|1N1#0z2L1C2Q2S2}0 271e2.2e2?0C130q0|0D2P310}302o331-35370|0M3b283d2Q2#013i0x38040c3m2R0~3p3g0@3s3u0O3x3o313q3D0|0X3G3z3I3B3r0e363t0|0#3N3e321Q3h3S3j040w3G1D2{1u2,2V0k2Z3q0j1|2v0$1N1C2`0H2|3c3*3?0%3~3f3!0@0T0|0%0m3*3A45010S0|0u4b3P4d0v0m0|2L0v0k0l0f0G1d2j0U0H4i442/010{040K4y3Z4A0v0|4t0v0)4L4F3q4C0J3G4h4c4H0|0z4w0j1s4O3Q4C0Z0P3N0u4+4T4j4V042u4t4S3Y3q0e0|0N4?4U2e4C0W4#4k4J4|4.2e47040m3S544z34531v3c4-5c1-0e4f042;5b4G340i4n280o4x5f3n4@4$0|4E5w2R5y524:1d4M0R5o4^0|0Q5K3Q0G0U39514A4%0V4*4,5E4A57590C5O5F0G5(4A5k0|5n5C045h5p3h5r040C5t5v2 4}1-4C5B5}551-5Q5S5:5Z4~0|4R5:5=3J4J5H285J6c685j5M5+2e65043a675~0@4%4)5:064,6z6d3Q5#5a6j6t3r4W4Y5|5g6k0@5-5m0v6n3h6I2M4!6s636u0|6w2}6y6A6%6M01570U4a6F6X6H044X6U6R6N0|020q0R0g4{6.5i3C5e2}6B4d6O280k6@6:4;0e5T6904506W707a794_040F794I6;6J7d5 0|5W6 5?6^045N7w3q6p6r736)7l6`6|7o4J1n7c7h7x4B0|7g627i7p5*7O4P7u6!3c6$6%7%744/7b7s6Y7f7,7j7X5z047v7F6G7l6~7^6/7V7M7/4 7/7V7k0|7n7B3Q7p6=4Z807u847z797D5X4+6)572L0R0l0C6Q875)7 7;4d818u7*6g4N8x7e7@7#1u413}3+8H0p3.1u0R3:8M2X2T1{1}2V0x1(8J3.1A437P2L0G0f0m0x0T0H0f0I0c0|1m1o1q1s0u7!5x1H3d1B0d1e0x0u0U0j0U0u1b0+0U0b0!958 0q0o3S2F0I2u910R0!5`0_0m0u2I2`0e0o5`1x2G9p0r2t0U8?0u0i0;9a100C0u1)0u2`2;930z1*1{1?0e0G0F0l0z0u0K2I9D0-2i0u0I0x1b0Z0B0u068~0u900s0.9(9B0!0)9O9K143?8o0l0u0R0e0l0-1)0-0ba30b0F9r1(0h2u0-1q940b1*0j0I0H0n9)al2i0R9Ka39Ha69p6,0m9lar0-4K5I0-058G4:ab8F3@049,060E900G0!4t0y0b0x9w0x0n2M9ba18V1)9)0u2?a49:9K0H36989p000!0n2Fa/9p8@0j3t0j0l0,0u2L0k1d0k6h0b0B1D3d8K0(0*0,04.