МЕНЮ

 

Гостевая книга

Форум

 

 

КАК РАЗЛОЖИТЬ ЧИСЛО 100 НА ЧАСТИ

            Задача №76 на сайте с задачами Projecteuler звучит примерно так: "Сколькими способами можно записать число 100 в виде суммы двух или более чисел, каждое из которых не меньше предыдущего (то есть числа идут в порядке возрастания)"
            Несколько способов: 100=1+99, 100=1+4+95, 100=1+1+1+1+...+1 (100 единиц)
            Как я ее решал? Допустим у нас есть функция Y, принимающая на вход два параметра: первый - минимальное слагаемое в сумме, второй - число, которое нужно разложить. Соответственно, для нашей задачи нужно найти Y(1,100)-1. То есть разложить число 100, и минимальное число в сумме - единица. Минус один потому что один вариант записи числа 100 просто как 100 мы не рассматриваем. Нужно два числа как минимум.
            Для разработки алгоритма, однако, отвлечемся, и попробуем найти Y(5,1). Это задание можно разложить на два - сначала попробовать вычесть из 5 единицу, и искать решения в виде 1+Y(4,1), где Y(4,1) - число разложений четверки. Все остальные решения будут иметь минимальным слагаемым двойку, поэтому можно записать их как Y(2,5) - число разложений пяти с минимальным слагаемым "2"
            Если вы не поняли, вот картинка:

            Число разложений пятерки с первым слагаемым не меньше двойки будет равно числу разложений тройки со слагаемым не меньше 2 (если представим пятерку как 2+Y(2,3)) и плюс число разложений пятерки со слагаемым не меньше трех - Y(3,5).
            Итого мы получили:

Y(1,5) = Y(2,5) + Y(1,4)
Y(2,5) = Y(3,5) + Y(2,3)

            Или, в общем виде, можно написать:

Y(A,B) = Y(A+1,B) + Y(A,B-A)

            Естественно, если A=B, то Y будет единица (число сто можно записать как сумму чисел, каждое из которых не меньше ста только одним способом), а если A>B, то Y=0, так как, например 10 вообще нельзя записать как сумму, если минимальное число 20.
            Теперь попробуем написать первые разложения числа 100:

Y(1,100) = Y(2,100) + Y(1,99) =
= Y(3,100) + Y(2,98) + Y(2,99) + Y(1,98) =
= Y(4,100) + Y(3,97) + Y(3,98) + Y(2,96) + Y(3,99) + Y(2,97) + Y(2,98) + Y(1,97) = ...

            Вот таким путем, все далее и далее, мы и решим в конце концов задачу.

Назад  
 

Хостинг от uCoz