Enoncé
Soit la suite dite de
Fibonacci définie par :
f0=1
f1=1
fn=fn-1+fn-2 pour n > 1
On souhaite écrire une fonction donnant le nombre de partitions d'un entier n écrites avec des nombres de la suite
de fibonacci. Une telle partition est défini par :
Par exemple, si n=10 il y a partitions
10=8+2
10=8+1+1
10=5+3+2
10=5+3+1+1
Solution
maxFibo=1000;
fonction sacADos(val n:entier):entier;
var fibo:tableau[0..maxFibo] d'entiers;
var Nfibo:entier;
var sac:tableau[1..partieEntiere(maxFibo/2)]d'entiers;
var Nsac;entier;
fonction fibonacci(val n:entier):vide;
début
fibo[0]=1;
fibo[1]=1;
Nfibo=1;
tanque fibo[Nfibo]<n et Nfibo<maxFibo faire
Nfibo=Nfibo+1;
fibo[Nfibo]=fibo[Nfibo-1]+fibo[Nfibo-2]
fintantque
fin
finfonction
fonction sacADosRec(val p:entier;val n:entier;val tailleSac:entier):vide;
début
si p=0 alors
ecrire(sac[1..tailleSac]);
Nsac=Nsac+1;
sinon
si n>=0 alors
si p>=fibo[n] alors
sac[tailleSac+1]=fibo[n];
sacADosRec(p-fibo[n],n-1,tailleSac+1);
finsi
sacADosRec(p,n-1,tailleSac);
finsi
finsi
fin
finfonction
début
fibonacci(n);
si fibo[Nfibo]<n alors
retourner(NULL)
sinon
Nsac=0;
sacADosRec(n,Nfibo,0);
retourner(Nsac);
finsi
fin
finfonction
Extension
Le problème plus général est connu sous le nome du problème du sac à dos. Il consiste à écrire toutes les partitions d'un entier à partir d'un ensemble d'entiers sans répétition. En exercice, on peut écrire cet algorithme.