回溯法解決0 1揹包問題(迭代)

2021-10-12 16:12:44 字數 2133 閱讀 2106

#include

using

namespace std;

class

knap

;int knap::

bound

(int i)

if(i<=n) b +

= cleft*

(p[i]

/w[i]);

return b;

}void knap::

iterative_backtrack()

if(t > n)

bestp = cp;

for(

int i=

1;i<=n;i++

) cout<<

" value "

<}else

while

(bound

(t+1

)<= bestp)

if(t<=0)

break

; x[t]=0

;//訪問最終回溯節點的右兒子

cw -

= w[t]

;//更新相應值

cp -

= p[t]

;//再次進入迴圈判斷右兒子是否符合限界函式}}

}class

object

;bool

cmp(object a,object b)

intknapsack

(int

* w,

int* p,

int c,

int n,knap& k)

if(wreturn p;

sort

(q,q+n,cmp)

;//依照單位重量的價值進行排序

k.p =

newint

[n+1];

k.w =

newint

[n+1];

k.x =

newint

[n+1];

k.bestx =

newint

[n+1];

for(

int i=

1;i<=n;i++

) k.cp =

0; k.cw =

0; k.c = c; k.n = n; k.bestp =0;

k.iterative_backtrack()

;//呼叫重要遍歷函式

delete

q;delete

k.w;

delete

k.p;

delete

k.x;

return k.bestp;

}void

init

(int

*&w,

int*

&p,int

& c,

int& n)

cout<<

"input value of objects"

int i=

1;i<=n;i++)}

void

print

(int bestp,

int n,

int*

& x)

}int

main()

//7 150

//35 30 60 50 40 10 25

//10 40 30 50 35 40 30

//170

//開始錯誤寫法

//void knap::iterative_backtrack()

// if(t>=n)

// else

// if(cp+bound(t+1)>bestp)

// else

// }

////void knap::iterative_backtrack()

// if(cp+bound(t+1) > bestp) //當裝不下t件物品時則停止訪問,判斷是否可以訪問其右子樹

// else

// if(t > n) //如果來到第n+1層則得到乙個解,根據約束函式和限界函式可知,此解即為目前最優解,更新

// }

//}

回溯法解決0 1揹包問題

1.回溯法可以看作是窮舉法的一種實現方式 2.基本過程 每一步只生成解的一部分 部分解 並立即對該部分解進行評估,若有可能擴充套件成為 所求解 則繼續擴充套件,得到新的部分解,泛指嘗試其他部分解,知道窮盡所有可能.3.解空間 所有的可能的解的集合 解空間樹 將解空間組織成樹形成的樹形結構 常見的解空...

回溯法解決01揹包問題

一 問題描述 有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?二 總體思路 因為回溯求解的規則是 後進先出 所以要用棧來存放符合條件的解,在儲存過程中用陣列來存放各個物品的體積和價值,然後用深度優先搜尋的方式求解,最後得到符合條件的最優解並輸出。三...

回溯法解決0 1揹包問題

問題描述 有n件物品和乙個容量為 c的揹包。第 i件物品的價值是 v i 重量是 w i 求解將哪些物品裝入揹包可使價值總和最大。所謂01揹包,表示每乙個物品只有乙個,要麼裝入,要麼不裝入。回溯法 01揹包屬於找最優解問題,用回溯法需要構造解的子集樹。在搜尋狀態空間樹時,只要左子節點是可乙個可行結點...