一、深度优先搜索(DFS)
假设我们处于一个迷宫当中,我们为了走出去,制定了一个方法:遇到分叉路口就往右走,直到遇到死胡同时,我们退回上一个分叉,继续向右走。按这个方法依次试探,我们就能走遍迷宫所有的路线,走出迷宫。我们可以用递归的方式来实现。
二、01背包问题
给定 n 种物品和一个容量为 C 的背包,物品 i 的重量是 wi,其价值为 vi 。
问:应该如何选择装入背包的物品,使得装入背包中的物品的总价值最大?
01背包问题的“分岔路“就是每个物品的选与不选,当物品的总重量大于容量时,便是死胡同。通常我们用index来表示当前处理的物品编号。还需要maxC和maxW来记录总价值和总重量,所以DFS函数应该是以下形式:DFS(int index,int sumW,int sumC);
总体代码实现如下:
#include<bits\stdc++.h>
using namespace std;
int n,V,maxValue=0;
int w[30],c[30];
void DFS(int index,int sumW,int sumC) {
if(index==n) {
if(sumW<=V&& sumC>maxValue) {
maxValue=sumC;
}
return ;
}
DFS(index+1,sumW,sumC);//不选当前物品
DFS(index+1,sumW+w[index],sumC+c[index]);//选了当前物品
}
int main() {
cin>>n>>V;
for(int i=0; i<n; i++) {
cin>>w[i];
}
for(int i=0; i<n; i++) {
cin>>c[i];
}
DFS(0,0,0);
cout<<maxValue<<endl;
return 0;
}