揹包問題(dfs剪枝優化)

2021-10-03 23:19:47 字數 1873 閱讀 5775

時間複雜度指數級

剪枝操作確實可以減去數倍的計算時間

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...