時間複雜度指數級
剪枝操作確實可以減去數倍的計算時間
clock_t start1,finish1,start2,finish2;
double duration1,duration2;
const
int maxn=40;
int n,v,maxvalue=0;
//物品件數,揹包容量,最大價值
int w[maxn]
,c[maxn]
;//每件物品的質量和價值
void
dfs(
int index,
int sumw,
int sumc)
return;}
//岔路口
dfs(index+
1,sumw,sumc)
;//不選第index件物品
dfs(index+
1,sumw+w[index]
,sumc+c[index]);
//選擇第index件物品
}//剪枝
int ans=0;
void
dfs(
int index,
int sumw,
int sumc)
dfs(index+
1,sumw,sumc);if
(sumw+w[index]
<=v)
dfs(index+
1,sumw+w[index]
,sumc+c[index]);
}}intmain()
for(
int i=
0;istart1 =
clock()
;dfs(0
,0,0
);finish1=
clock()
; start2=
clock()
;dfs(0
,0,0
);finish2=
clock()
; duration1 =
(double
)(finish1- start1)
/ clocks_per_sec;
duration2 =
(double
)(finish2- start2)
/ clocks_per_sec;
printf
("%d %g\n"
,maxvalue,duration1)
;//列舉
printf
("%d %g\n"
,ans,duration2)
;//剪枝
return0;
}
//這是測試結果
3425012
3456
78910
1112
1314
1516
1718
1920
2122
2324
2526
2728
2930
3132
333445
1376
41867
1930
4520
1617
3217
7689
4332
6787
9032
6899
7856
6798
101105
84390.29
84332.728
//剪枝
//單位是秒
//快了兩倍左右,當然了,具體問題還是要具體分析
DFS 剪枝解決0 1揹包
有num件物品,每件物品的重量為w i 價值為v i 現在需要選出若干件物品放入乙個容量為capacity的揹包中,使得在選入揹包的物品重量和不超過容量capacity的前提下,讓揹包中的物品的價值之和最大,求最大價值 1 num 20 分析 可用dfs搜尋所有情況,但缺點在於進行過多無用搜尋。可以...
DFS寫揹包問題
dfs解決揹包問題 include 用深搜寫 using namespace std int weight,maxvalue 0,n 揹包中能放物品的總質量weight,最大價值maxvalue,總的物品數量 int v 30 w 30 物品的數量和價值 void dfs int index,int...
DFS解決01揹包問題
本篇博文著重用dfs解決著名的揹包問題 01揹包問題要點在 選與不選。所以我們很容易聯想到dfs來解決這個問題!下面我們來看看是如何實現的 includeusing namespace std const int n 30 int w n value n n,maxvalue 0,v void df...