背包问题(dfs剪枝优化)

时间复杂度指数级
剪枝操作确实可以减去数倍的计算时间


clock_t start1,finish1,start2,finish2;
double duration1,duration2;

const int maxn=40;
int n,v,maxValue=0;//物品件数,背包容量,最大价值 
int w[maxn],c[maxn];//每件物品的质量和价值 
void dfs(int index,int sumw,int sumc){
	//深度搜索,index为当前处理的物品编号
	//sumw为当前总重量,sumc为当前总价值 
	if(index==n){//已经完成对n件物品的选择 
		if(sumw<=v&&sumc>maxValue){
			maxValue=sumc;
			//不超过背包容量时候更新最大价值 
		}
		return;
	}
	//岔路口 
	dfs(index+1,sumw,sumc);//不选第index件物品 
	dfs(index+1,sumw+w[index],sumc+c[index]);
						//选择第index件物品 
}

//剪枝
int ans=0; 
void  DFS(int index,int sumw,int sumc){
	if(index==n){
		return;
	}
	DFS(index+1,sumw,sumc);
	if(sumw+w[index]<=v){
		if(sumc+c[index]>ans){
			ans=sumc+c[index];
		}
		DFS(index+1,sumw+w[index],sumc+c[index]); 
	}
}

int main(){
	scanf("%d%d",&n,&v);
	for(int i=0;i<n;i++){
		scanf("%d",&w[i]);
	}
	for(int i=0;i<n;i++){
		scanf("%d",&c[i]);
	}
	
	start1 = clock();
	dfs(0,0,0);
	finish1= clock();
	
	start2=clock();
	DFS(0,0,0);
	finish2=clock(); 
	duration1 = (double)(finish1- start1) / CLOCKS_PER_SEC;
	duration2 = (double)(finish2- start2) / CLOCKS_PER_SEC;
	printf("%d %g\n",maxValue,duration1);//枚举 	
	printf("%d %g\n",ans,duration2);//剪枝 
	
	return 0;
}

//这是测试结果
34 250
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
4 5 1 3 7 6 4 18 6 7 19 30 45 20 16 17 32 17 76 89 43 32 67 87 90 32 68 99 78 56 67 98 101 105

843 90.29
843 32.728//剪枝
//单位是秒
//快了两倍左右,当然了,具体问题还是要具体分析
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DFS算法(深度优先搜索算法,Depth-First Search)是一种常用的图搜索算法,用于遍历或搜索图或树的所有节点。DFS算法通过递归的方式实现,在搜索过程中优先探索深度,直到到达叶节点再回溯。 在MATLAB中实现DFS算法,可以采用如下步骤: 1. 创建一个函数,用于实现DFS算法。命名为dfs。 2. 设置输入参数,例如起始节点和目标节点。 3. 初始化一个栈数据结构,用于保存待搜索的节点。 4. 初始化一个集合,用于保存已访问的节点。 5. 将起始节点压入栈中,并标记为已访问。 6. 当栈不为空时,执行以下步骤: a. 弹出栈顶节点,将其标记为已访问。 b. 如果当前节点是目标节点,则搜索完成,返回。 c. 如果当前节点不是目标节点,则获取其所有邻接节点。 d. 遍历邻接节点: - 如果邻接节点没有被访问过,则压入栈中,并标记为已访问。 e. 重复步骤6直到栈为空。 7. 如果栈为空仍未找到目标节点,则搜索失败,返回。 使用DFS算法可以解决很多与图相关的问题,例如寻找图中路径,判断图的连通性等。在实际应用中,可以根据具体的问题进行相应的修改和优化,以适应不同的需求。 需要注意的是,在实际编写代码时,应该考虑避免重复访问节点,避免死循环,以及处理异常情况。另外,对于复杂的图结构,可能需要使用其他数据结构或算法进行优化,以提高搜索效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值