(ProjectEuler) Комбинации сумм

От ProjectEuler.net:

Prob 76: Сколько разных способов можно записать в виде суммы как минимум двух положительных целых чисел?

Я не знаю, как начать это... любые точки в правильном направлении или помочь? Я не ищу, как это сделать, но некоторые подсказки о том, как это сделать.

Например, 5 можно записать так:

4 + 1
3 + 2
3 + 1 + 1
2 + 2 + 1
2 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1

Итак, 6 возможностей.

Ответ 1

Номера разделов (или функции раздела) являются ключом к этому.

Проблемы, подобные этим, обычно проще, если вы начинаете снизу и прокладываете себе путь, чтобы узнать, можете ли вы обнаружить любые шаблоны.

  • P (1) = 1 = {1}
  • P (2) = 2 = {[2], [1 + 1]}
  • P (3) = 3 = {[3], [2 + 1], [1 + 1 + 1]}
  • P (4) = 5 = {[4], [3 + 1], [2 + 2], [2 + 1 + 1], [1 + 1 + 1 + 1]}
  • P (5) = 7...
  • P (6) = 11...
  • P (7) = 15...
  • P (8) = 22...
  • P (9) = 30...

Совет. Посмотрите, можете ли вы построить P (N) из некоторой комбинации результатов до P (N).

Ответ 2

Решение может быть найдено с использованием алгоритма измельчения.

Используйте, например, 6. Затем мы имеем:

6
5+1
4+2
3+3

но мы еще не закончили.

Если мы возьмем 5 + 1 и рассмотрим часть +1 как законченную, потому что все остальные конечные комбинации обрабатываются 4 + 2 и 3 + 3. Поэтому нам нужно применить тот же трюк к 5.

4+1+1
3+2+1

И мы можем продолжить. Но не бездумно. Поскольку, например, 4 + 2 производит 3 + 1 + 2 и 2 + 2 + 2. Но мы не хотим 3 + 1 + 2, потому что у нас будет 3 + 2 + 1. Таким образом, мы используем только все производные 4, где самое низкое число больше или равно 2.

6
5+1
  4+1+1
    3+1+1+1
      2+1+1+1+1
        1+1+1+1+1+1
    2+2+1+1
  3+2+1
4+2
  2+2+2
3+3

Следующий шаг - поместить это в алгоритм.

Хорошо, нам нужна рекурсивная функция, которая принимает два параметра. Число, которое нужно нарезать, и минимальное значение:

func CountCombinations(Number, Minimal)
  temp = 1
  if Number<=1 then return 1
  for i = 1 to Floor(Number/2)
    if i>=Minimal then
      temp := temp + CountCombinations(Number-i, i)
  end for
  return temp
end func

Чтобы проверить алгоритм:

C(6,1) = 1 + C(5,1) + C(4,2) + C(3,3) = 11, which is correct.
C(5,1) = 1 + C(4,1) + C(3,2) = 7
C(4,1) = 1 + C(3,1) + C(2,2) = 5
C(3,1) = 1 + C(2,1) = 3
C(2,1) = 1 + C(1,1) = 2
C(1,1) = 1
C(2,2) = 1
C(3,2) = 1
C(4,2) = 1 + C(2,2) = 2
C(3,3) = 1

Кстати, количество комбинаций 100:

CC(100) = 190569292
CC(100) = 190569291 (if we don't take into account 100 + 0)

Ответ 3

Хороший способ приблизиться к ним не зацикливается на "100", но попытайтесь рассмотреть, какая разница между суммированием для суммы n и n + 1 будет, если искать шаблоны при увеличении n 1,2,3....

Я бы поехал сейчас, но у меня есть работа:)

Ответ 4

Как и большинство проблем в Project Euler с большими номерами, лучший способ подумать о них - это не быть в тупике с этой огромной верхней границей и думать о проблеме в меньших терминах, и постепенно прокладывать себе путь. Возможно, по дороге вы узнаете шаблон или узнаете достаточно, чтобы легко получить ответ.

Единственный другой намек, который, я думаю, могу дать вам, не испортив ваше прозрение, - это слово "раздел".

Как только вы это поняли, вы получите его в кратчайшие сроки:)

Ответ 5

один подход состоит в том, чтобы думать о рекурсивной функции: найти перестановки числовой серии, взятой из положительных целых чисел (допускаемых дубликатов), которые составляют до 100

  • нуль равен 1, т.е. для числа 1 существуют нулевые решения
  • единица равна 2, т.е. для числа 2 существует только одно решение

другой подход состоит в том, чтобы думать о генеративной функции: начинать с нуля и находить последовательности перестановок до цели, сохраняя отображение/хэш или промежуточные значения и числа

вы можете перебирать значение с 1 или пересчитывать с 100; вы получите тот же ответ в любом случае. В каждой точке вы можете (для наивного решения) сгенерировать все перестановки ряда положительных чисел, считанных до целевого числа минус 1, и подсчитать только те, которые прибавляют к целевому номеру

Удачи!

Ответ 6

Примечание. Моя математика немного ржавая, но, надеюсь, это поможет...

Вы хорошо справляетесь со своей проблемой.

Подумайте:

  • Число n может быть записано как (n-1) +1 или (n-2) +2
  • Вы обобщаете это на (n-m) + m
  • Помните, что вышеупомянутое также относится ко всем номерам (включая m)

Итак, идея состоит в том, чтобы найти первый набор (скажем, 5 = (5-1) +1), а затем рассматривать (5-1) как новый n... 5 = 4 +1... 5 = ((4-1) + 1) +1. Однажды, которая исчерпана, снова начинается на 5 = 3 + 2.... которая становится 5 = ((3-1) +1) +2.... = 2 + 1 + 2.... разрушая каждый как вы идете.

Ответ 7

Многие математические проблемы могут быть решены с помощью induction. Вы знаете ответ для определенного значения, и вы можете найти ответ для каждого значения, если найдете что-то, что связывает n с n+1.

Например, в вашем случае вы знаете, что ответ для Сколько разных способов можно записать в виде суммы по крайней мере двух положительных целых чисел? - всего 1.

Что я имею в виду со ссылкой между n и n+1? Ну, я имею в виду, что вы должны найти формулу, которая сообщит вам ответ на n, вы найдете ответ для n+1. Затем, вызывая рекурсивно эту формулу, вы узнаете ответ, и вы сделали (обратите внимание: это только математическая часть этого, в реальной жизни вы можете обнаружить, что такой подход дал бы вам что-то слишком медленное, чтобы быть практичным, поэтому вы еще не сделали - в этом случае я подумаю, что вы сделаете).

Теперь предположим, что вы знаете, что n может быть записано как сумма как минимум двух положительных целых чисел? в k разными способами, одним из которых будет:

n = a1 + a2 + a3 +... am (эта сумма имеет m слагаемых)

Что вы можете сказать о n+1? Поскольку вы хотели бы просто намеки, я не пишу здесь решение, а только то, что следует. Конечно, у вас есть те же самые k разные способы, но в каждом из них будет член +1, один из которых будет:

n + 1 = a1 + a2 + a3 +... am + 1 (эта сумма имеет m + 1 членов)

Тогда, конечно, у вас будут другие возможности k, такие как те, в которых последний член каждой суммы не один и тот же, но он будет увеличен на единицу, например:

n + 1 = a1 + a2 + a3 +... (am + 1) (эта сумма имеет m слагаемых)

Таким образом, существует как минимум 2k способов записи n+1 в виде суммы по крайней мере двух положительных целых чисел. Ну, есть и другие. Найдите это, если вы можете:-) И наслаждайтесь: -))