Уведомления

Группа в Telegram: @pythonsu

#1 Май 30, 2017 20:49:12

Enfoire
Зарегистрирован: 2017-04-21
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

acmp №398 Разбиение числа на слагаемые

Засел на этой задачке. Есть решение, которое улетает по времени, есть другое - улетает по памяти, по времени норм. Как улучшить решение или как принципиально по - другому подойти к нему?

Задано натуральное число x. Найдите число способов представить его в виде суммы четырех натуральных чисел: x = a + b + c + d, где a <= b <= c <= d.

Ввод:
натуральное число

Вывод:
количество разбиений

Решение, вылетающие по памяти:

 import itertools
 
n = int(input())
count = 0
sequence = []
rrange = list(range(1, n - (n // 3)))
 
tools = ([i for i in itertools.combinations_with_replacement(rrange, 3)
          if sum(i) <= n - 1])
 
for i in tools:    
    step = []
    k = n - sum(i)
    if k > 0:
        step.append(sorted(i + (k, ))[:3])
        if sequence.count(step) == 0:
            count += 1
    sequence.append(step)
     
print(count)

Отредактировано Enfoire (Май 30, 2017 20:49:39)

Офлайн

#2 Май 30, 2017 21:10:46

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

acmp №398 Разбиение числа на слагаемые

А если вот так

 import itertools
n = int(input())
count = 0
sequence = []
rrange = list(range(1, n - (n // 3)))
tools = ([i for i in itertools.combinations_with_replacement(rrange, 4)
          if sum(i) == n])
print(len(tools))

Офлайн

#3 Май 30, 2017 21:20:53

Enfoire
Зарегистрирован: 2017-04-21
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

acmp №398 Разбиение числа на слагаемые

Romissevd
А если вот так
Не смотрел пошагово, но по ответам не добирает. И я думаю все равно по памяти вылетит. Тут надо либо отказываться вообще от функций itertools (а как грамотно тогда организовать перебор?), либо не держать в памяти tools, а выдергивать и оперировать на лету - в этом случае залет по времени..

Офлайн

#4 Май 30, 2017 21:41:31

Romissevd
От: Счастье
Зарегистрирован: 2015-03-01
Сообщения: 533
Репутация: +  76  -
Профиль   Отправить e-mail  

acmp №398 Разбиение числа на слагаемые

да там у меня не всегда берет правильные комбинации. подправил - попробуй

 import itertools
n = int(input())
rrange = list(range(1, n))
tools = ([i for i in itertools.combinations_with_replacement(rrange, 4)
          if sum(i) == n])
print(len(tools))

Отредактировано Romissevd (Май 30, 2017 22:00:09)

Офлайн

#5 Май 31, 2017 04:33:08

Enfoire
Зарегистрирован: 2017-04-21
Сообщения: 9
Репутация: +  0  -
Профиль   Отправить e-mail  

acmp №398 Разбиение числа на слагаемые

Romissevd
да там у меня не всегда берет правильные комбинации. подправил - попробуй
Долгий( он в интервале на n очень долго формирует четверки, но спасибо!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version