子集和問題的完全多項式近似模式

2021-08-10 07:45:42 字數 1196 閱讀 4187

1. 問題定義

輸入:有限正整數集合s = 和正整數t;

輸出:s的某個子集s',使其元素之和最大且不超過t。

2. 指數時間演算法

為了求解問題的優化解,我們採用列舉法求s得所有子集和。列舉方法的基本思想是,依次對i=0,1, ... , n-1,利用的所有子集和構造的所有子集和,最終得到s的所有子集和。已知li=表示進行到i元素時的所有子集和,那麼li+1即可表示為。為了操作方便,將li維護成乙個有序表。於是li+1 也是乙個有序列表。演算法步驟如下圖所示:

1. n = |s|

2. l0 = <0>

3. for i = 1 to n do

4.        li = mergelist(li-1, li-1 + xi)

5.        從li中刪除大於t的元素

6. 輸出ln中最大值z

利用數學歸納法,不難證明li列舉了小於等於t的所有所有子集和。當t充分大時演算法第5步不刪除任何元素,第4步開銷為o(2^i),因此總開銷為o(2^n)。

3. 有序列表的修剪演算法

修剪有序列表l的目標有兩個。乙個是刪除盡可能多的元素,二是控制近似精度。具體地講,給定有序列表l和修剪引數δ∈(0,1)。根據δ修剪l是指:從l中刪除盡可能多的元素;如果l'為刪減後的結果,那麼則對l中的每乙個元素y,存在z∈l'使得(1- δ) y ≤ z ≤  y, 即z相對於y的相對誤差小於δ。修剪演算法如下:

1. m = |l|

2. l' = , last = y1

3. for i = 2 to m do

4.        if last < (1- δ) * yi then

5.                將yi新增到l'中

6.                last = yi

7.輸出l』

記li = ,那麼有zk ≤ (1- δ) * zk-1≤ (1- δ)^2 * zk-2 ≤ ... ≤ (1- δ)^k * z0。由於zk不大於t,那麼(1- δ)^k * z0≤ t。最終解得k ≤ (lnt - lnz0) / -ln(1- δ) ≤ n(lnt - lnz0) / ε。

4. 完全多項式近似模式

在指數時間演算法的第4步加入修剪演算法,可將指數時間將為多項式時間。該演算法的時間複雜度為o(n^2 * (lnt - lnz0) ), 並且近似解z與問題優化解z*之間的相對誤差不超過ε。

BR MTC問題的多項式時間近似解演算法框架發展過程

br mtc budgeted rooted maximum tree cover 問題是帶權值有根的最大樹覆蓋問題。輸入為乙個無向圖,乙個權值b,乙個根節點r,輸出為一棵包含根節點r,邊的權值之和不超過權值b的覆蓋最多頂點的樹。首先我們可以考慮到,權值b的大小應該是有限的,一般不會超過這張圖最小生...

兩多項式的和多項式 馬鴻凱 新浪部落格

求兩多項式的和多項式 a x 5 x 17 9 x 8 3x 7 b x 9 x 8 22 x 7 8 x include include typedef struct node int ax int xb struct node next node void initlink node head ...

多項式的表示和運算

多項式的關鍵資料 compare函式,比較p1和p2的指數大小,p1大返回1,p2大返回 1,相等返回0 attach函式 將計算結果複製到結果多項式 n為多項式的項數 完整 加法 乘法 include typedef struct node pnode struct node 將一項加入鍊錶,尾插...