Ainsi, la logique est d'inverser sorte les chiffres, et supposons que la liste des numéros est l et somme à former est s .
for i in b:
if(a(round(n-i,2),b[b.index(i)+1:])):
r.append(i)
return True
return False
puis, nous allons à travers cette boucle et un numéro est sélectionné de l en ordre et laisser dire qu'il est i . il y a 2 cas possibles , soit i est la partie de la somme ou non. Donc, nous supposons que je fait partie de la solution et le problème se réduit à l être l[l.index(i+1):]et de l' être si oui, si notre fonction est un (l, s) nous appelons a(l[l.index(i+1):] ,s-i). et si je ne fait pas partie de s alors nous devons former s de la l[l.index(i+1):]liste. Il est donc similaire dans les deux cas, seul changement est si je fait partie de s, alors s = si et autrement s = s seulement.
maintenant pour réduire le problème tel que le nombre de cas dans l sont supérieurs à s nous les retirons de réduire la complexité jusqu'à ce que l est vide et dans ce cas, les numéros qui sont sélectionnés ne font pas partie de notre solution et nous retournons faux.
if(len(b)==0):
return False
while(b[0]>n):
b.remove(b[0])
if(len(b)==0):
return False
et dans le cas où l n'a que 1 élément gauche alors soit il peut faire partie de s alors nous revenons vrai ou ce n'est pas alors nous revenons faux et boucle passer par un autre numéro.
if(b[0]==n):
r.append(b[0])
return True
if(len(b)==1):
return False
noter dans la boucle si ont utilisé b..but b est notre liste only.and i ont arrondi partout où il est possible, de sorte que nous ne devrions pas avoir de mauvaise réponse en raison de calculs à virgule flottante en python.
r=[]
list_of_numbers=[61.12,13.11,100.12,12.32,200,60.00,145.34,14.22,100.21,14.77,214.35,200.32,65.43,0.49,132.13,143.21,156.34,11.32,12.34,15.67,17.89,21.23,14.21,12,122,134]
list_of_numbers=sorted(list_of_numbers)
list_of_numbers.reverse()
sum_to_be_formed=401.54
def a(n,b):
global r
if(len(b)==0):
return False
while(b[0]>n):
b.remove(b[0])
if(len(b)==0):
return False
if(b[0]==n):
r.append(b[0])
return True
if(len(b)==1):
return False
for i in b:
if(a(round(n-i,2),b[b.index(i)+1:])):
r.append(i)
return True
return False
if(a(sum_to_be_formed,list_of_numbers)):
print(r)
cette solution fonctionne fast.more rapide d'un expliqué ci-dessus. Cependant, cela fonctionne pour les nombres positifs seulement. Cependant aussi fonctionne bien s'il y a une solution que sinon il faut pour beaucoup de temps pour sortir des boucles.
une course exemple est comme ceci permet de dire
l=[1,6,7,8,10]
and s=22 i.e. s=1+6+7+8
so it goes through like this
1.) [10, 8, 7, 6, 1] 22
i.e. 10 is selected to be part of 22..so s=22-10=12 and l=l.remove(10)
2.) [8, 7, 6, 1] 12
i.e. 8 is selected to be part of 12..so s=12-8=4 and l=l.remove(8)
3.) [7, 6, 1] 4
now 7,6 are removed and 1!=4 so it will return false for this execution where 8 is selected.
4.)[6, 1] 5
i.e. 7 is selected to be part of 12..so s=12-7=5 and l=l.remove(7)
now 6 are removed and 1!=5 so it will return false for this execution where 7 is selected.
5.)[1] 6
i.e. 6 is selected to be part of 12..so s=12-6=6 and l=l.remove(6)
now 1!=6 so it will return false for this execution where 6 is selected.
6.)[] 11
i.e. 1 is selected to be part of 12..so s=12-1=1 and l=l.remove(1)
now l is empty so all the cases for which 10 was a part of s are false and so 10 is not a part of s and we now start with 8 and same cases follow.
7.)[7, 6, 1] 14
8.)[6, 1] 7
9.)[1] 1
juste pour donner une comparaison que je courais sur mon ordinateur qui est pas si bon. en utilisant
l=[61.12,13.11,100.12,12.32,200,60.00,145.34,14.22,100.21,14.77,214.35,145.21,123.56,11.90,200.32,65.43,0.49,132.13,143.21,156.34,11.32,12.34,15.67,17.89,21.23,14.21,12,122,134]
et
s = 2000
ma boucle a couru 1018 fois et 31 ms.
et la boucle de code précédent a couru 3415587 fois et a pris quelque part près de 16 secondes.
Cependant, dans le cas où une solution n'existe pas mon code a couru plus de quelques minutes si je me suis arrêté et code précédent a couru près d'environ 17 ms seulement et code précédent fonctionne avec des nombres négatifs aussi.
de sorte que je certaines améliorations peuvent être fait.