DFS
深搜(也可以称为回溯法),可以理解为不撞南墙不回头,只有一直搜索下去,直到不满足结果,返回到上层,重新选择分支。
经典例题 背包问题
有n
个物品,每个物品的重量是w[i]
每个物品的价值是c[i]
,现在背包最大容量是V
,那么如何选择这n个物品可以使背包中的物品价值最大
思路
本题涉及到对每个物品的选择,即可以将其看作岔路口,选择或者不选择是两个分支。
除此之外,应该设置目前的总重量sumW
,以便确定是否撞了“南墙”,“南墙”的设置是当前总重量不能大于V背包总容量。
总价值sumC
是为了确定满足南墙的选择组合是否为最大价值。
对下标为i
的物品,选择即进入到DFS(i+1,sumW+w[i],sumC+c[i])
分支
不选择则进入到DFS(i+1,sumW,sumC)
分支
结束条件是i>=n
,即遍历完所有的物品
代码实现
#include <iostream>
using namespace std;
int w[5]={3,5,1,2,2};
int c[5]={4,5,2,1,3};
int V=8;
int n=5;
int maxValue = 0;
void DFS(int i,int sumW,int sumC)
{
if(i>=n&& sumW<=V)
{
if(sumC>maxValue)
{
maxValue = sumC;
}
}
if(i>=n || sumW>V) //剪枝
{
return;
}
DFS(i+1,sumW+w[i],sumC+c[i]);
DFS(i+1,sumW,sumC);
}
int main(int argc, const char * argv[]) {
DFS(0,0,0);
cout<<maxValue<<endl;
return 0;
}
写在后面
刚接触DFS,后面会总结更多的题的