Файл: Ху, Т. Целочисленное программирование и потоки в сетях.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 15.10.2024
Просмотров: 200
Скачиваний: 0
|
|
|
|
|
18.1. |
ЗАДАЧА О РЮКЗАКЕ |
|
|
|
|
373 |
|||||
|
Элементы 1-й строки i (1, у) второй таблицы получаются по сле |
|||||||||||||||
дующему |
правилу: |
|
|
ГО, |
если |
|
==°, |
|
|
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|||||
|
|
|
|
Н ’ |
|
1 1 , |
если ф ^ ^ О . |
|
|
|
|
|||||
Остальные элементы i {к, |
у) второй таблицы получаются по сле |
|||||||||||||||
дующему |
правилу: |
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
i{k — 1 , у), |
если |
t y h - i ( y ) > t y k ( y — |
a h) + ch, |
(!') |
||||||||
|
|
|
|
к, |
|
если |
tyh-i(y)s^tyk(y —ah) + ck. |
|||||||||
|
|
|
|
|
|
|||||||||||
Заметим, |
что |
если |
i (1, |
у) |
= 1, |
то это означает, что |
предмет |
|||||||||
1-го типа |
используется |
в ф4 (у). |
Предположим, |
например, |
что |
|||||||||||
i (к — 1, |
у) = у. Это значит, что |
Xj ^ |
1 |
в ф ц |
(у). Теперь |
мы |
||||||||||
хотим |
знать, |
какие |
ха |
дают |
|
(у — а3). |
Находим |
элемент |
||||||||
i (к — 1, у — а^. Если i (к — 1, |
у — aj) ==/, то |
это значит, что |
||||||||||||||
Xj |
^ 1 |
в |
грй_1 (у — а,) |
(т. е. |
х} ^ 2 |
в |
фй_! |
(у))- |
Если |
же |
||||||
г (к — 1 , у — a}) ~ q , |
то |
это значит, что х, |
^ 1 |
в |
|
(у — Oj). |
||||||||||
Для того чтобы определить, выгодно |
ли |
использовать |
предмет |
|||||||||||||
к-то типа вфА(у), мы сравним значения фА_1 |
{у) ифй (у — ah) + ck. |
|||||||||||||||
(В этот момент величина фй (у) еще не известна.) Если |
в ф* {у) |
|||||||||||||||
мы используем предмет к-то типа хотя бы один раз, |
то |
фй(у) = |
||||||||||||||
= |
Фа (*/ — ak) + ch. Таким образом, если ф ц <г/) < ф й (у — ah)+ |
|||||||||||||||
+ |
cft, то полагаем i ( к , у) = к . |
Если же фЛ_! (у) > фk (у — а*) + |
||||||||||||||
+ |
сА, |
то |
невыгодно |
использовать предмет |
к-то |
типа |
в фй (у), |
|||||||||
и поэтому полагаем i ( к , у) = |
i |
(к — 1, у). |
Заметим, |
что |
нам |
|||||||||||
известны |
величины фй (0 ) = 0 и ф0 {у) — 0 , |
следовательно, |
эле |
менты к- й строки 2 -й матрицы, так же как и значения ф& (у),
могут быть найдены один за другим слева направо с помощью соотношений (1 ) и (1 ').
Прежде чем сделать несколько замечаний, рассмотрим пример.
Пусть имеется |
четыре предмета, |
b = 10, щ = 1, с2 = 3, с3 = 5, |
с4 = 9, cj = 2, |
а2 = 3, а3 = 4, а4 |
= 7. Заполним первую таблицу, |
сначала вычисляя элементы 1 -й строки слева направо, затем
элементы 2-й строки и т. д. Получим табл. 18.1 и 18.2. Заметим, что при вычислении ф4 (1 0 ) мы фактически подсчитываем все
значения фй (у) для |
l ^ |
f c ^ 4 и |
О ^ у ^ Ю . Из табл. |
18.1. |
видим, что ф4 (10) = |
12. |
Из табл. |
18.2 видим, что i (4, 10) |
= 4, |
т. е. четвертый предмет используется по крайней мере один раз.
Чтобы |
определить, |
какие предметы дают |
ф4 (10), |
находим |
|||||
i (4, 10 — а4) = |
г (4, 3) = |
2 (т. е. |
второй |
предмет |
используется |
||||
по крайней мере один раз), затем находим i |
(4; |
3 — а3) = г (4, 0) = |
|||||||
= 0 (т. е. ф4 (1 0 ) получается при использовании только |
второго |
||||||||
и четвертого предмета). |
Важной |
особенностью |
рассмотренной |
||||||
схемы |
вычислений |
является тот |
факт, что для подсчета |
||||||
Фа (у ) |
(0 < 1 у ^ |
Ъ) |
используются |
только |
фд_1 (у) (0 ^ |
у ^ Ъ). |
374 |
|
|
|
|
|
|
ГЛ. 18. |
ЗАДАЧА О РЮКЗАКЕ |
|
|
|
|
|
|
|
|
||||||
|
|
Т а б л и ц а 1 8 . 1 |
|
|
|
|
|
|
Т а б л и ц а 1 8 . 2 |
|
|
|
|
|||||||||
|
|
Значения гр/, ( у ) |
|
|
|
|
|
Значения |
г ( к , |
у ) |
|
|
|
|||||||||
У |
1 |
2 |
3 |
4 5 6 7 8 |
9 10 |
N . у |
1 2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
|||||||
к N ^ |
к N . |
|||||||||||||||||||||
1 |
0 |
1 |
1 |
2 |
2 |
3 |
3 |
4 |
|
4 |
5 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
2 |
0 |
1 |
3 |
3 |
4 |
6 |
6 |
7 |
9 |
9 |
2 |
0 |
1 |
2 |
2 |
2 |
2 |
2 |
2 |
2 |
2 |
|
3 |
0 |
1 |
3 |
5 |
5 |
6 |
8 |
10 |
|
10 |
11 |
3 |
0 |
1 |
2 |
3 |
3 |
3 |
3 |
3 |
3 |
3 |
4 |
0 |
1 |
3 |
5 |
5 |
6 |
9 |
10 |
10 |
12 |
4 |
0 |
1 |
2 |
3 |
3 |
3 |
4 |
3 |
4 |
4 |
|
Следовательно, |
не |
нужно |
запоминать |
всю |
таблицу |
для |
|
(у) |
||||||||||||||
и можно |
сразу |
«забыть» |
элемент -фй_! (у) |
(к — 1 )-й |
строки, |
|
как |
только подсчитан расположенный под ним элемент г|зА(у). Это значительно экономит память вычислительной машины. Такие же рассуждения относятся и ко второй таблице: для нахождения всех Xj достаточно запоминать только ее последнюю строку.
Заметим, что в нашем примере i (4, 8 ) = 3, т. е. при Ъ = 8
четвертый предмет, имеющий наибольшее отношение — (т. е. мак-
a J
симальную ценность на единицу веса), вообще не используется. Если на xj не наложено условие целочисленности, то задача легко решается следующим образом. Выбирается предмет, обла
дающий максимальным отношением
Сг |
С1 |
—— = т а х — . |
|
ат |
■j «} |
Затем рюкзак заполняется предметами только этого типа: хт— — .
а г
Этот подход нельзя использовать для решения задачи о рюкзаке с целочисленными xj, поскольку число хтможет оказаться нецелым. Обозначим = Cj/aj и перенумеруем типы предметов таким обра зом, чтобы выполнялось следующее условие:
Pi ss*5 Р2 sS* рз =s== • • • |
Нп- |
Рассмотрим следующее интуитивное решение: сначала заполним рюкзак максимально возможным количеством предметов 1 -го типа, затем, если позволит ограничение Ь, предметами 2 -го типа и т. д.
Такое интуитивное решение обычно дает хорошие результаты, но не всегда является оптимальным для задачи с условием цело численности Xj.