DFS解决01背包问题

本篇博文着重用dfs解决著名的背包问题

01背包问题要点在:选与不选。所以我们很容易联想到dfs来解决这个问题!

下面我们来看看是如何实现的:

#include
using namespace std;
const int N=30;
int w[N],value[N],n,maxvalue=0,V;
void dfs(int index,int sumw,int sumv)
{
	if(index>n)
	{
		if(sumw<=V&&sumv>maxvalue)
		{
			maxvalue=sumv;
		}
		return;
	}
	dfs(index+1,sumw+w[index],sumv+value[index]);//选 
	dfs(index+1,sumw,sumv);//不选 
}
int main()
{
	cin>>n>>V;
	for(int i=1;i<=n;++i)
	{
		cin>>w[i];
	}
	for(int i=1;i<=n;++i)
	{
		cin>>value[i];
	}
	dfs(1,0,0);
	cout<

但是注意到一个问题没有?总是把n件物品选完后才去更新最大值,忽视了总重不超过V的条件,所以,我们可以来优化一下。

void dfs(int index,int sumw,int sumv)
{
	if(index>n) return;
	dfs(index+1,sumw,sumv);//不选 
	if(sumw+w[index]<=V)
	{
		if(sumv+value[index]>maxvalue)
		{
			maxvalue=sumv+value[index];
		}
		dfs(index+1,sumw+w[index],sumv+value[index]);//选
	} 
}
这样,算法时间复杂度在一定程度上减轻了很多,这种根据题目条件来修改递归边界的方法叫做剪枝。

你可能感兴趣的:(算法)