|
Пусть элемент Ci таблицы C соответствует стоимости i-го предмета, а элемент Mi таблицы M - массе i-го
предмета. Будем считать, что предметы пронумерованы в порядке
их следования в таблицах.
Пусть T обозначает
функцию, значение которой соответствует решению нашей задачи.
Аргументами функции является количество предметов (по этому
аргументу можно определить их стоимости и массы
соответствующих предметов), а также максимальная суммарная
масса, которую можно унести.
Определим подзадачи T(i,
j), где i обозначает количество
начальных предметов, из которых можно осуществлять выбор, а j определяет максимально возможную
суммарную массу уносимых предметов. Отметим, что определенный
таким образом первый параметр i
определяет как количество предметов для подзадачи, так и
значения их стоимостей и масс, определяемых из таблиц C и M.
Определим сначала начальные значения функции
T. При нулевых значениях одного из
аргументов значение функции равно нулю:
Определим возможные значения функции T(i, j) при ненулевых значениях аргументов.
Решение подзадачи, соответствующей функции T(i, j) может быть сведено к двум
возможностям: уносится ли при наилучшем решении предмет с
номером i или нет.
Если предмет не уносится, то решение задачи с
i предметами сводится к решению
подзадачи с i-1 предметами, т. е.
Если предмет c номером i уносится, то это уменьшает максимально
возможную суммарную массу для i-1 первых
предметов на величину M[i], одновременно
при этом увеличивая значение решения для оставшихся предметов
T(i-1,j-M[i]) на величину C[i], т. е.
При этом необходимо учитывать, что вторая
ситуация возможна только тогда, когда масса i-го предмета не больше значения j.
Для получения наилучшего решения необходимо
выбрать лучшую из этих двух возможностей. Поэтому рекуррентное
соотношение при i³1 и j³1 имеет вид
Пусть заданы следующие значения стоимости и
массы для 5 предметов:
Таблица значений функции T, которую мы также назовем T, выглядит следующим образом:
| i\j |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
| 0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
| 1 |
0 |
0 |
0 |
0 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
5 |
| 2 |
0 |
0 |
0 |
0 |
5 |
7 |
7 |
7 |
7 |
12 |
12 |
12 |
12 |
12 |
12 |
12 |
12 |
| 3 |
0 |
0 |
0 |
4 |
5 |
7 |
7 |
9 |
11 |
12 |
12 |
12 |
16 |
16 |
16 |
16 |
16 |
| 4 |
0 |
0 |
0 |
4 |
5 |
7 |
7 |
9 |
11 |
12 |
13 |
14 |
16 |
16 |
18 |
20 |
21 |
| 5 |
0 |
0 |
0 |
4 |
5 |
7 |
8 |
9 |
11 |
12 |
13 |
15 |
16 |
17 |
19 |
20 |
21 |
Следовательно, решение задачи T(5,16)=21. Однако это не значит
автоматически, что суммарная масса уносимых предметов равна
16. Действительно, T(1,16)=5, а
соответствующая этой подзадаче суммарная масса предметов равна
4. Рассмотренная задача является широко известной задачей о
рюкзаке.
T[0, 0]: = 0
for j:= 1 to 16 do
T[0, j] = 0;
for i:=1 to 5 do
T[i, 0]: = 0
For i:=1 to 5 do
for j:=1 to 16 do
if j >= M[i] then
T[i, j]: = max(T[i - 1, j], T[i - 1, j - M[i]] + C[i])
else
T[i, j] = T[i - 1, j]
|