Deci, logica este de a inversa un fel numerele, și să presupunem lista numerelor este l și suma care urmează să fie format este s .
for i in b:
if(a(round(n-i,2),b[b.index(i)+1:])):
r.append(i)
return True
return False
Apoi, vom trece prin această buclă și un număr este selectat dintre l în ordine și să zicem că este eu . există 2 cazuri posibile , fie i este parte a sumei sau nu. Deci, presupunem că am face parte din soluție și atunci problema se reduce la l ființei l[l.index(i+1):]și e ființa si asa, daca functia noastra este (l, e) atunci numim noi a(l[l.index(i+1):] ,s-i). și dacă eu nu este o parte a lui , atunci avem de a forma e din l[l.index(i+1):]listă. Deci, este similară în ambele cazuri, numai schimbarea este dacă am face parte din s, numai atunci s = Si si altfel s = s.
acum pentru a reduce problema, astfel încât într-un număr de caz în l sunt mai mari decât s le eliminăm pentru a reduce complexitatea până nu este gol și în acest caz, numerele care sunt selectate nu sunt o parte a soluției noastre și ne întoarcem false.
if(len(b)==0):
return False
while(b[0]>n):
b.remove(b[0])
if(len(b)==0):
return False
iar în cazul în care L are doar un element de stânga, apoi, fie poate fi o parte a lui, atunci ne întoarcem adevărat sau nu, atunci vom reveni fals și bucla va trece prin alt număr.
if(b[0]==n):
r.append(b[0])
return True
if(len(b)==1):
return False
nota în buclă în cazul în care au folosit b..but b este lista noastră de only.and am rotunjit ori de câte ori este posibil, astfel încât să nu ar trebui sa răspuns greșit din cauza calcule în virgulă mobilă în 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)
această soluție funcționează fast.more rapidă decât cea explicată mai sus. Totuși, acest lucru funcționează doar pentru numere pozitive. Cu toate acestea, de asemenea, funcționează bine în cazul în care există o soluție doar în caz contrar este nevoie de prea mult timp pentru a iesi din bucle.
un exemplu rula este ca acest lucru vă permite să spun
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
doar pentru a da o comparație pe care am fugit de pe calculatorul meu, care nu este atât de bun. utilizând
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]
și
s = 2000
bucla mea a fugit 1018 de ori și 31 ms.
și bucla de cod anterior a fugit 3415587 ori și a luat undeva aproape de 16 secunde.
Cu toate acestea, în cazul în care o soluție nu există codul meu a fugit mai mult de câteva minute, așa că am oprit și codul anterior a fugit doar aproape în jurul valorii de 17 ms și codul anterior funcționează cu numere negative, de asemenea.
așa că am unele îmbunătățiri lucru se poate face.