深度优先搜索(来自《算法笔记》胡凡)

问题:

有n件物品,每件重量为w[i],价值为c[i],放进容量为V的背包中。

求:能放进背包的物品的最大价值?

分析:

1.每件物品:选、不选,两种状态(迷宫的岔道口)

2.超过V,边界(迷宫的死胡同)

3.到达边界,返回最近的岔道口

4.DFS需要记录:

  • 当前物品编号index
  • 选择当前物品之前的:总重量sumW、总价值sumC
  • void DFS(int index, int sumW, int sumV)

5.两种转移状态

  • 放入index,重量增加sumW+=w[index],价值增加sumC+=c[i],接着处理index+1的物品

        DFS(index+1,sumW+w[index],sumC+c[i])

  • 不放入index,重量、价值不变,处理index+1号物品

        DFS(index+1,sumW,sumC)

6.结束:index增长到n,此时的sumW、sumC为最终的,sumW不超过V就去比较sumC与之前最大的值
//深度优先搜索
//使用递归可以很好完成深度优先搜索--利用栈

#include
const int maxn = 30;
int n,V,maxValue=0;
int w[maxn],c[maxn];

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()
{
	scanf("%d%d",&n,&V);
	for(int i=0;i

你可能感兴趣的:(深度优先搜索(来自《算法笔记》胡凡))