HDU 1455 DFS+剪枝

该博客介绍了一种使用深度优先搜索(DFS)解决HDU 1455问题的方法,并着重强调了剪枝优化在过程中的关键作用。博主首先将树枝按长度排序,从最长的开始搜索,当找到满足条件的最小拼凑长度时停止。在DFS过程中,通过变量记录搜索状态,并在循环中实施剪枝策略:1. 当长度为0时,直接返回,避免无效搜索;2. 跳过与当前树枝长度相同的后续树枝。文章提供了具体实现代码,展示了如何在实践中应用DFS和剪枝技巧。
摘要由CSDN通过智能技术生成

思路:

DFS:

首先,将这些树枝从小到大排序,然后从最大的树枝开始搜索,到这些树枝长度总和为止,只要dfs到满足条件的最小拼凑长度就break掉

那么,在dfs里面,x参数表示从哪根树枝搜索,len表示当前的拼凑的树枝长度,hope表示期望拼凑的长度,size表示所用树枝的根数。每用一根树枝都会使size+1,终止条件为所用树枝根数和总根数相等,那么表示可以满足题意

在dfs循环内部,从前往后,如果该树枝没被用过且当前长度+该树枝长度小于等于期望长度那么进行判断,将该树枝标记为用过,分情况讨论继续往下dfs:如果刚好等于要拼凑的长度hope那么继续往下深搜,初始化参数,根数+1;否则在这个条件之上进行dfs,然后回溯。

循环下面的剪枝(这题需要剪枝优化):

1.len==0 return ;表示最开始的时候第一根树枝根本就用不了,那么这个dfs就不用进行下去了(因为你下面无论怎么dfs,这根树枝总是组成不了你想要的那个数值,所以所用树枝根数恒不等于总根数,往下没必要)。

2.while(i<n&&a[i+1]==a[i])i++; 因为if语句判断到最后是没有满足等于期望长度这个条件的,所

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值