#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揹包屬於找最優解問題,用回溯法需要構造解的子集樹。在搜尋狀態空間樹時,只要左子節點是可乙個可行結點...