動態規劃01揹包問題之跳躍點解法

2021-10-07 14:56:14 字數 3337 閱讀 7940

m (i

,j)=

ma

xm(i,j) = max\

m(i,j)

=max

m (i

,j)代

表餘量j

從第乙個

物品到第

i個物品

的最優價

值m(i,j)代表餘量j從第乙個物品到第i個物品的最優價值

m(i,j)

代表餘量

j從第一

個物品到

第i個物

品的最優

價值p (i

)代表m

(i,j

)的跳躍

點點

集p(i)代表m(i,j)的跳躍點點集

p(i)代表

m(i,

j)的跳

躍點點集

q (i

)代表m

(i,j

−w[i

])+v

[i]的

跳躍點點

集合

q(i)代表 m(i,j-w[i])+v[i]的跳躍點點集合

q(i)代表

m(i,

j−w[

i])+

v[i]

的跳躍點

點集合

備註

1.其 中其中

其中q(i)可由p

(i)的

每乙個點

加上(w

[i],

v[i]

)得到。

可由p(i)的每乙個點加上(w[i],v[i])得到。

可由p(i)

的每乙個

點加上(

w[i]

,v[i

])得到

。2.p(i

−1)並

上q(i

−1)然

後減去必

然不合法

的點(同

w下v非

最大的點

和w較大

但是v較

小)即為

p(i)

p(i-1)並上 q(i-1)然後減去必然不合法的點(同 w 下 v 非最大的點和w較大但是v較小)即為 p(i)

p(i−1)

並上q(

i−1)

然後減去

必然不合

法的點(

同w下v

非最大的

點和w較

大但是v

較小)即

為p(i

) 具體**實現的注意事項:

使用一維表table加head來表示二維表

head[i]:表示第i個行的開端。

其中在pass不合法的點對時,對於q和p中的值採用的方法不一致。具體看**注釋

const

int n =

1e4, m =

1e6;

struct data

//建構函式,預設w,v都為0

data operator+(

const data& r)

const

//設計data結構體的+操作

bool

operator==(

const data& r)

const

//設計data結構體的==操作};

int head[n +2]

;//標記每乙個i的表的首元素,相當於將一維陣列轉換為二維陣列

data goods[n]

, table[m]

;//goods儲存物品資訊,table[i]儲存對應裝前i個物品對應的(w,v)

stack<

int> numlist;

//存放最終放入物品序號的棧

int n, c;

//物品數量和揹包總容量

// trace back to find the solution vector x[1……n]

void

traceback

(data estate)}}

}// jump points' method to slove the 0-1 bag's problem

intgknapsack()

/*w 等於它的,對 v 取更大的值*/

if(k <= boundaryr && table[k]

.w == temp.w)

/*w 大於它的,根據 v 值直接pass 掉 不合法的點(w 大但 v 小於前邊的)*/

//這裡pass的為q佇列不合適的對

if(temp.v > table[next -1]

.v)while

(k <= boundaryr && table[k]

.v <= table[next -1]

.v)++k;

//將多餘的刪除掉。這裡忽略在p行的違規的對

}while

(k <= boundaryr)

boundaryl = boundaryr +1;

//boundaryl指向p[i]的左邊界,即下乙個i對應的表的左邊界,因為此時p[i]的表已經填好,要利用i標記來借助p[i]匯出p[i+1]

boundaryr = next -1;

//因為next指向p[i+1]的首位置的索引,所以boundaryr指向next-1,即得到p[i]的右邊界

head[i +1]

= next;

}traceback

(table[next -1]

);return table[next -1]

.v;}

演算法複雜度分析?:

此演算法的計算量在於求解p[i]

p[i]的跳躍點對應x1,

...,

xi

x_1,...,x_i

x1​,..

.,xi

​的0-1賦值,p[i]的跳躍點個數不超過2

i2^i

2i故計算時間為

o (∑

i=1n

2n=o

(2n)

o(\sum^n_=o(2^n)

o(∑i=1

n​2n

=o(2

n)當所給的物品重量為整數時,∣p[

i]

∣<=c

+1

|p[i]|<=c+1

∣p[i]∣

<=c

+1,所以總的時間複雜度為o(m

in(n

c,2n

))

o(min(nc,2^n))

o(min(

nc,2

n))

演算法 0 1揹包(跳躍點解法)

由m i,j 的遞迴式容易證明,在一般情況下,對每乙個確定的i 1 i n 函式m i,j 是關於變數j的階梯狀單調不減函式。跳躍點是這一類函式的描述特徵。在一般情況下,函式m i,j 由其全部跳躍點唯一確定。如圖所示。對每乙個確定的i 1 i n 用乙個表p i 儲存函式m i,j 的全部跳躍點。...

動態規劃之01揹包問題

首先是問題描述 給定n種物品和一揹包,物品i的重量是wi,其價值是pi,揹包的容量是m,問如何選擇裝入揹包中的物品總價值最大?可以這樣理解 揹包的揹負有上限,因此在這個上限內盡可能多的裝東西,並且價值越多越好。在這裡我之想討論動態規劃解決這個問題的詳細過程。動態規劃是用空間換時間的一種方法的抽象。其...

動態規劃之0 1揹包問題

問題描述 現有n件物品和乙個容量為c的揹包。第i件物品的重量是重量為w i 價值是v i 已知對於一件物品必須選擇取 用1表示 或者不取 用0表示 且每件物品只能被取一次 這就是 0 1 的含義 求放置哪些物品進揹包,可使這些物品的重量總和不超過揹包容量,且價值總和最大。求解思路 0 1揹包問題的遞...