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

Project Euler 105 — Special Sum Sets

Условие задачи

Пусть S(A) — сумма элементов множества A. Множество A называется special sum set, если для любых двух непустых непересекающихся подмножеств B и C выполняются:

  1. S(B) \ne S(C) (суммы не равны)
  2. Если |B| > |C|, то S(B) > S(C)

Дан файл sets.txt с 100 наборами по 712 чисел. Найти сумму S(A) по всем special sum set.

Требования к решению

  • Функциональный стиль (F#)
  • Обязательно использовать хвостовую рекурсию хотя бы раз
  • Использовать методы работы с коллекциями (List.map, List.filter, и т.д.)
  • Запрещены циклы
  • Решение должно быть разбито на несколько осмысленных коммитов, разнесённых по времени

Теория и критерии

  1. Префикс-суффикс неравенства: для отсортированного A:
    
    \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
    
    Это гарантирует правило (2).
  2. Уникальность всех сумм: все суммы непустых подмножеств должны быть различны.

Алгоритм (F#)

  1. Прочитать файл, преобразовать строки в списки чисел
  2. Для каждого множества:
    • Проверить префикс-суффикс неравенство (хвостовая рекурсия)
    • Проверить уникальность всех сумм подмножеств (методы коллекций)
  3. Просуммировать суммы подходящих множеств

Проверка

  • Зарегистрироваться на projecteuler.net
  • Проверить ответ (для задачи 105 — 73702)