HDU 1455 DFS+剪枝

思路:

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语句判断到最后是没有满足等于期望长度这个条件的,所

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值