От ProjectEuler.net:
Вероятность 76: Сколько разных способов можно записать сотню как сумму как минимум двух положительных целых чисел?
Я понятия не имею, с чего начать ... Есть какие-то точки в правильном направлении или помощь? Я не ищу, как это сделать, но немного подсказки о том, как это сделать.
Например, 5 можно записать так:
4 + 1
3 + 2
3 + 1 + 1
2 + 2 + 1
2 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1
Итак, всего 6 возможностей.
Похоже, вы уже нашли один способ. Вы интуитивно определили метод с рекурсивным перечислением. На самом деле, использование рекурсии дало бы вам довольно элегантное решение. Обратите внимание, что, объединив все способы добавления 3 и все способы добавления 2, вы определили несколько способов сложения 5.
название может быть более конкретным :-)
Да, пожалуйста, отредактируйте заголовок, чтобы он был более конкретным.
Все дело в том, чтобы самому найти ответ, так что это жульничество :) Но @Bill the Lizard прав.
Ааа, вот как попасть в ТОП-10 Project Euler! Просто задавайте вопросы здесь!





Хороший способ подойти к ним - не зацикливаться на «100», а попытаться понять, какая разница между суммированием суммы п и п + 1, ища закономерности при увеличении n 1,2,3 ....
Я бы сейчас пошел, но у меня есть работа :)
Примечание: моя математика немного ржавая, но, надеюсь, это поможет ...
Вы хорошо справляетесь с решением проблемы.
Думайте в общем:
Итак, идея состоит в том, чтобы найти первый набор (скажем, 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 .... как вы идете.
Как и большинство проблем в Project Euler с большими числами, лучший способ думать о них - это не зацикливаться на этой огромной верхней границе, а думать о проблеме в меньших терминах и постепенно продвигаться вверх. Возможно, по пути вы узнаете закономерность или узнаете достаточно, чтобы легко найти ответ.
Единственный другой намек, который я могу дать вам, не испортив ваше прозрение, - это слово «раздел».
Как только вы это поймете, вы получите это в кратчайшие сроки :)
Номера разделов (или функции разделения) являются ключом к этому.
Подобные проблемы обычно легче решить, если вы начнете снизу и постепенно подниметесь вверх, чтобы увидеть, сможете ли вы обнаружить какие-либо закономерности.
Подсказка: посмотрите, сможете ли вы построить P (N) из некоторой комбинации результатов, предшествующих P (N).
Надо любить числа [абзац 3 - P (10 ^ 3) = 190569292]
один из подходов состоит в том, чтобы подумать рекурсивная функция: найти перестановки числового ряда, взятые из положительных целых чисел (дубликаты разрешены), которые в сумме дают 100
другой подход - подумать о генеративная функция: начать с нуля и найти ряд перестановок до цели, сохраняя карту / хэш или промежуточные значения и подсчеты
вы можете выполнять итерацию от 1 до 100; в любом случае вы получите один и тот же ответ. В каждой точке вы могли (для наивного решения) сгенерировать все перестановки серии положительных целых чисел, считая до целевого числа минус 1, и считать только те, которые в сумме составляют целевое число.
удачи!
Решение можно найти с помощью алгоритма измельчения.
Используйте, например, 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)
Я считаю, что OP просил подсказок, а не самого ответа.
Не могли бы вы помочь мне с этим с помощью PHP, потому что я не знаю, что это за язык программирования и что именно: означает
Многие математические задачи могут быть решены с помощью индукция.
Вы знаете ответ для конкретного значения, и вы можете найти ответ для каждого значения, если найдете что-нибудь, связывающий 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 членов)
Таким образом, существует как минимум 2к способов записи n+1как сумму не менее двух натуральных чисел. Ну, есть и другие. Узнай, если сможешь :-)
И наслаждаться :-))
на самом деле у меня есть идея, но я не знаю, как воплотить эту идею в программируемую форму.