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的物品不放入揹包時 搜尋...