Изменения

Перейти к: навигация, поиск

Meet-in-the-middle

281 байт добавлено, 23:37, 16 декабря 2012
Нет описания правки
Реализуем данный алгоритм:
// N - количество всех вещей, w[] - массив весов всех вещей, cost[] - массив стоимостей всех вещей, R - ограничение по весу рюкзака.
'''knapsack()''' sn = <tex> \leftarrow </tex> N / 2, fn = <tex> \leftarrow </tex> N - sn; '''for ''' mask = 0 to <tex> \rightarrow </tex> 2 ** sn - 1 '''for ''' j = 0 to <tex> \rightarrow </tex> sn '''if ''' j-ый бит mask = 1 first[i].w += w[j]; first[i].c += cost[j]; '''sort'''(first); '''for ''' i = 0 to <tex> \rightarrow </tex> 2 ** sn - 1 '''if ''' (существует такое подмножество с индексом j, что first[j].w <= first[i].w && first[j].c >= first[i].c) удалим множество с индексом i из массива first
'''for ''' mask = 0 to <tex> \rightarrow </tex> 2 ** fn - 1 '''for ''' j = 0 to <tex> \rightarrow </tex> fn '''if ''' j-ый бит mask = 1 curw += w[j + sn]; curcost += cost[j + sn];
В массиве first бинарным поиском находим подмножество, с максимальным весом, который не превышает R - curw '''if ''' (first[index].w <= R - curw && first[index].c + curcost > ans) ans = first[index].c + curcost print '''return''' ans
Итоговое время работы <tex> {O({2^{N/2}}\times({N}+\log{2^{N/2}}))} = O({2^{N/2}}\times{N}) </tex>.
28
правок

Навигация