Эта задача относится к категории сложной NP, с сокращением от задача о рюкзаке.
Короткое интуитивное «доказательство»: идея в том, чтобы создать вершину для каждого элемента — вы можете «брать» или «не брать», выбирая вершину со стоимостью или «свободную» вершину. .
Эскиз:
![введите здесь описание изображения](https://i.stack.imgur.com/D4AD1.png)
В приведенном выше вы можете видеть, что из задачи о рюкзаке создайте график, для каждого предмета вы можете выбрать, взять его - и заплатить стоимость и получить «ценность», или проигнорировать его.
Более формально:
Для экземпляра рюкзака с weights=w1,w2,w3,...cn
и cost=c1,c2,..,cn
с некоторым максимальным весом W
создайте граф G=(V,E)
с
V= { V_i,U_i,W_i | i=0,...n }
E= { (W_i,V_i+1,U_i+1 | i=0,...,n-1} U {(V_i,W_i+1), (U_i,W_i+1) | i=0,...,n-1 }
value(W_i,V_i+1) = c_i+1
money(W_i,V_i+1) = w_i+1
value(W_i,U_i+1) = 0
money(W_i,U_i+1) = 0
money(V_i,W_i+1) = cost(V_i,W_i+1) = money(U_i,W_i+1) = cost(U_i,W_i+1) = 0
Решение этой задачи, которое использует не более W денег, будет также решением для рюкзака с максимальной вместимостью W.
Возможным псевдополиномиальным решением может быть (с использованием метода динамического программирования) :
D(start,0) = 0
D(v,x) = infinity x < 0
D(v,x) = min { D(u,x-money(u,v)) + value(u,v) | for each edge (u,v) } U {infinity}
В приведенном выше D(v,x)
минимальное расстояние, необходимое для путешествия от начального узла до v
, заплатив ровно x
денег.
Обратите внимание, что это можно сделать, потому что это DAG, поэтому вы можете вычислять значения от первого до последнего в соответствии с топологическая сортировка.
Когда закончите, вам нужно найти все значения x
от 0
до MAXIMAL_AMOUNT_OF_MONEY_ALLOWED
, чтобы найти минимальное значение D(target,x)
, и это ответ.
Нахождение фактической стоимости выполняется путем повторного отслеживания ваших шагов, как это делается в других решениях динамического программирования.
Вышеуказанная продолжительность работы O(|V|*MAX_MONEY + |E|)
person
amit
schedule
07.07.2015