Więc logiczne jest, aby odwrócić porządek liczb, i załóżmy listę liczb l i suma zostać utworzony s .
for i in b:
if(a(round(n-i,2),b[b.index(i)+1:])):
r.append(i)
return True
return False
Następnie przechodzimy tej pętli i numer jest wybrany z L w porządku i niech mówią, że to ja . istnieją 2 możliwe przypadki, albo ja to część sumy, czy nie. Więc zakładamy, że ja jest częścią rozwiązania, a wtedy problem sprowadza się do l samopoczucia l[l.index(i+1):]i ów byt Si więc, jeśli nasza funkcja jest (l, s), to nazywamy a(l[l.index(i+1):] ,s-i). i jeśli ja nie jest częścią s to musimy tworzyć s z l[l.index(i+1):]listy. Więc to jest podobne w obu przypadkach, jedyną zmianą jest jeśli jest częścią s, następnie s = si a inaczej s = s tylko.
teraz, aby zmniejszyć problem taki, że w liczbach przypadków wl przewyższają s my je usunąć w celu zmniejszenia złożoności aż l jest pusta iw tym przypadku numery, które zostały wybrane nie są częścią naszego rozwiązania, a my return false.
if(len(b)==0):
return False
while(b[0]>n):
b.remove(b[0])
if(len(b)==0):
return False
i w przypadku, L ma tylko jeden pierwiastek w lewo, a następnie każda z nich może być częścią s następnie powrócić prawdziwe, czy nie jest wtedy powrót fałszywy i uchwyt przechodzą przez inną liczbę.
if(b[0]==n):
r.append(b[0])
return True
if(len(b)==1):
return False
Uwaga: w pętli, jeśli zostały wykorzystane b..but B znajduje się lista only.and i mają zaokrąglone wszędzie tam, gdzie jest to możliwe, tak, że nie powinniśmy dostać odpowiedź z powodu złego obliczeń zmiennoprzecinkowych punkt w Pythonie.
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)
to rozwiązanie działa fast.more szybko niż jeden wyjaśniono powyżej. Jednak to działa tylko dla liczb dodatnich. Jednak również działa dobrze, jeśli nie jest to rozwiązanie tylko inaczej zajmuje dużo czasu, aby wyjść z pętli.
przykładem jest prowadzony tak powiedzmy
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
po prostu dać porównanie który wpadłem na moim komputerze, który nie jest tak dobry. za pomocą
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
e = 2000
moja pętla pobiegł 1018 razy i 31 ms.
a poprzedni kod pętli prowadził 3415587 razy i zabrał gdzieś blisko 16 sekund.
Jednak w przypadku, gdy rozwiązanie nie istnieje mój kod prowadził więcej niż kilka minut, więc przestałem go i poprzedni kod pobiegł tylko w pobliżu około 17 ms i poprzedni kod działa z liczbami ujemnymi również.
więc rzeczą pewną poprawę można zrobić.