|
| Пример #2. |
|
Для заданного числа N
необходимо определить количество его различных разложений на
слагаемые. Два разложения считаются различными, если они
отличаются хотя бы одним слагаемым, при этом порядок слагаемых
не важен. Так для числа 3 разложения 2+1
и 1+2 считаются одинаковыми. |
|
Для описания пространства подзадач одним из
параметров обязано быть величина числа, которое разлагается на
слагаемые. Покажем, что другим параметром может быть
максимальное слагаемое в разложении числа. Действительно, не
умаляя общности можно считать, что слагаемые в разложении
упорядочены в порядке не возрастания. Тогда, зафиксировав
величину первого слагаемого (например, Р), исходную задачу разложения числа Х можно свести к следующим подзадачам. Для
этого, вычтя из Х первое слагаемое, нам
достаточно найти количество разложений числа Х-Р на слагаемые, причем в этих разложениях
слагаемые не должны превышать Р.
Определим функцию Т(Х,Р), которая соответствует количеству
разложений числа Х на слагаемые, причем
максимальное слагаемое равно Р. Тогда
можно записать следующую рекуррентную формулу
Смысл этой формулы состоит в том, что первое
слагаемое соответствует количеству разложений числа Х-Р на слагаемые, причем максимальное
слагаемое в каждом разложении равно Р,
что второе слагаемое соответствует количеству разложений числа
Х-Р на слагаемые, причем максимальное
слагаемое в каждом разложении равно Р-1,
и т.д. Понятно, что такие разложения заведомо отличаются друг
от друга, что гарантирует правильность суммирования.
Для получения правильного рекуррентного
соотношения необходимо определить начальные значения функции.
Очевидно, что
Решение задачи может быть записано следующим
образом.
for i:=0 to N do
T[i, i] := 1;
for i:=0 to N do
for j:=i+1 to N do
T[i,j]:=0;
for X:=1 to N do
for P:=1 to X-1 do
begin
S:=1;
for i:=P downto 1 do
S:=S+T[X-P,i]
T[X,P]:=S;
End;
S:=0;
for P:=1 to N do
S:=S+T[N,P];
|
| Пример #3. |
|
Имеется N (N<100) дисков одинаковой толщины с
радиусами R1, ... , RN. Эти диски упаковываются в
коробку таким образом, что каждый из них стоит ребром на дне
коробки, и все диски находятся в одной плоскости, как
изображено на рисунке 1.
Найти минимальную длину коробки, в которую
все они могут быть упакованы.
Пример: для 3 дисков с радиусами 2.0, 1.0 и
2.0 минимальная длина равна 9.65685 |
|
Для решения поставленной задачи воспользуемся
следующими соображениями. Предположим, что уже известно
положение центров первых K дисков, при
котором каждый следующий упирается в один из предыдущих, и
пусть X1, X2,...,XK - эти координаты. При этом
можно полагать, что X1=0. Для
определения положения центра следующего K+1 диска попробуем "упереть" его в каждый
из предыдущих дисков, и пусть координаты X1, X2 ,..., XK определяют соответственно
координаты центра K+1 диска, который
"упирается" в 1,2,..., K диски. Эти
положения центров дисков вычисляются следующим образом:
Нетрудно понять, что в действительности диск
K+1 примет самое "правое" из этих
положений, т.е. XK+1=max{X1,
X2,...,XK}. Однако было бы ошибочным
полагать, что длина искомой коробки равна R1+(XN-X1)+RN.
Для правильного решения задачи для каждого
диска определить его левый и правый край следующим образом:
Тогда истинный размер искомой коробки равен
L=max{Rdi}-min{Ldi}.
|
Назад
|