You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
2.1 KiB
2.1 KiB
Project Euler 105 — Special Sum Sets
Условие задачи
Пусть S(A)
— сумма элементов множества A
. Множество A
называется special sum set, если для любых двух непустых непересекающихся подмножеств B
и C
выполняются:
S(B) \ne S(C)
(суммы не равны)- Если
|B| > |C|
, тоS(B) > S(C)
Дан файл sets.txt
с 100 наборами по 7–12 чисел. Найти сумму S(A)
по всем special sum set.
Требования к решению
- Функциональный стиль (F#)
- Обязательно использовать хвостовую рекурсию хотя бы раз
- Использовать методы работы с коллекциями (
List.map
,List.filter
, и т.д.) - Запрещены циклы
- Решение должно быть разбито на несколько осмысленных коммитов, разнесённых по времени
Теория и критерии
- Префикс-суффикс неравенства: для отсортированного
A
:
Это гарантирует правило (2).\sum_{i=1}^{k+1} a_i > \sum_{i=0}^{k-1} a_{n-i}, \quad k=1,\dots,\left\lfloor\frac n2\right\rfloor
- Уникальность всех сумм: все суммы непустых подмножеств должны быть различны.
Алгоритм (F#)
- Прочитать файл, преобразовать строки в списки чисел
- Для каждого множества:
- Проверить префикс-суффикс неравенство (хвостовая рекурсия)
- Проверить уникальность всех сумм подмножеств (методы коллекций)
- Просуммировать суммы подходящих множеств
Проверка
- Зарегистрироваться на projecteuler.net
- Проверить ответ (для задачи 105 — 73702)