Представете числото $2018$ като сбор на възможно най-много различни квадрати на естествени числа.
(Задачата е от олимпиада няма да кажа от коя година).
from functools import lru_cache
import math
maxlen = 0
@lru_cache(maxsize=None)
def search(s):
global maxlen
if sum(s) == 2018 and maxlen < len(s):
maxlen = len(s)
nums = [math.sqrt(a) for a in s]
print(maxlen, "$\Rightarrow", ", ".join([ "%d^2 "%a for a in nums]), "$")
return
if sum(s)<2018:
return
for i in range(len(s)):
sc = list(s[:])
del sc[i]
search( tuple(sc))
squares = tuple([ a**2 for a in range(1,21)])
search(squares)Евва написа:Подскажете ми- освен метода на налучкването какъв друг метод мога да използвам ?
pal702004 написа:Евва написа:Подскажете ми- освен метода на налучкването какъв друг метод мога да използвам ?
Забавна е, но не за програмиране. ...
def search(i, numbers,s):
if s==2018:
print(len(numbers), numbers)
return
elif s>2018:
return
for k in range(1,3):
search(i+k, numbers + [i+k], s + (i+k)**2)
search(0,[],0)
peyo написа:[..Намерих ново много по-добро решение откъм време и памет, което първо дава най-дългата редица , а след това по странна логика и други решенияя, но не всички:
- Код: Избери целия код
def search(i, numbers,s):
if s==2018:
print(len(numbers), numbers)
return
elif s>2018:
return
for k in range(1,3):
search(i+k, numbers + [i+k], s + (i+k)**2)
search(0,[],0)
def search(i, numbers,s):
if s==2018:
print(len(numbers), numbers)
return
elif s>2018 or i>44:
return
search(i+1, numbers +[i+1], s + (i+1)**2)
search(i+1, numbers, s)
search(0,[],0)ptj написа:Намереното решение с 17 числа е единствено:
[tex](1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,17,18,19)[/tex]
Регистрирани потребители: Google [Bot]