DFS寫揹包問題

2021-09-12 12:08:10 字數 1889 閱讀 6135

dfs解決揹包問題

#include

///用深搜寫

using namespace std;

int weight,maxvalue=

0,n;

///揹包中能放物品的總質量weight,最大價值maxvalue,總的物品數量

int v[30]

,w[30];

///物品的數量和價值

void

dfs(

int index,

int sumw,

int sumv)

///第index件物品,選擇的總質量sumw,總價值sumv

///要寫index+1,不能寫index++,否則出不來

dfs(index+

1,sumw+w[index]

,sumv+v[index]);

///岔路口1:選擇這件物品

dfs(index+

1,sumw,sumv)

;///岔路口2:不選擇,總的來說就是乙個集合有多少個子集

}int

main()

for(

int i=

0;i) cin>>v[i]

;///從0開始

dfs(0,

0,0)

; cout << maxvalue << endl;

return0;

}

通過減枝優化後的程式,若不遇到極端情況,效率提公升許多

void

dfs(

int index,

int sumw,

int sumv)

///減枝,優化一下

}

具體的遞迴過程類似於下圖,每次遞迴進入下一層都有兩種分支(岔路口)

f(3),f(2)的兩個岔路口

上**

#include

using namespace std;

int n,k,maxsumsqu=-1

,x;///n個數中選擇k個使得他們的和為x,求出平方和最大的一組數

int a[30]

;///集合內元素

vector<

int>temp,ans;

///temp存放臨時最大的方案,ans存放最終方案

void

dfs(

int index,

int nowk,

int sum,

int sumsqu)

return;}

///處理完n個數,或者超過k個數,或者和超過x,返回

if(index==n||nowk>k||sum>x)

return

;///選擇index號方案

temp.

push_back

(a[index]);

dfs(index+

1,nowk+

1,sum+a[index]

,sumsqu+a[index]

*a[index]);

///不選擇index號方案

DFS解決01揹包問題

本篇博文著重用dfs解決著名的揹包問題 01揹包問題要點在 選與不選。所以我們很容易聯想到dfs來解決這個問題!下面我們來看看是如何實現的 includeusing namespace std const int n 30 int w n value n n,maxvalue 0,v void df...

揹包問題(dfs剪枝優化)

時間複雜度指數級 剪枝操作確實可以減去數倍的計算時間 clock t start1,finish1,start2,finish2 double duration1,duration2 const int maxn 40 int n,v,maxvalue 0 物品件數,揹包容量,最大價值 int w ...

DFS解01揹包問題

01揹包問題的dfs解法 直接dfs未剪枝 時間複雜度 o 2n nn 其原因是對任意的物品,都是選或者不選 兩次的情況 dfs三個形參 物品序號index,放進揹包的重量sumw,以及放進揹包的總價值sumc 主要搜尋路徑 序號為index的物品放入揹包時 序號為index的物品不放入揹包時 搜尋...