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
n2n
=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揹包問題的遞...