POJ1011-Sticks-经典搜索题详解优化

本文详细介绍了如何通过深度优先搜索(DFS)加剪枝策略解决 POJ 1011 Sticks 问题。文章首先概述了问题背景,随后提出了有效的解题思路,并对关键步骤进行了深入剖析,包括木棒长度的选择、剪枝条件的应用等。

Sticks

http://poj.org/problem?id=1011

解题思路

1.一开始的思路是遍历木棒能组成的所有长度,然后进行许多判断;发现判断过程很复杂,做不了,就换了个思路;
2.遍历所有可能的木棒长度len,并得到木棒的个数cnt;

len满足 sum%len==0;
cnt=sum/len;

3.得出DFS的终止条件:

拼接成功的木棒 > cnt 或者 无法继续拼接

4 .然后就是这题的精华:各种剪枝与优化

1.木棍应从长到小遍历;
2.限制拼接一根木棒的木棍长度是递减的,因为 y+x == x+y;(但每次拼接一根木棒时都要从1 ~ n遍历一遍)
3.记录最近一个拼接的木棍长度,如果搜索失败,以后不再向当前木棒(stick)中添加相同长度的木棍;
4.如果当前木棍作为最后一部分使得木棒拼接成功(cab+num[i]==len),并且接下来拼接之后木棒的分支(DFS(stick+1,0,1)==false),那么就可以判断当前分支失败,直接回溯,即不再向当前木棒中添加相同长度的木棍。

总结

(吐槽一句:POJ不支持万能头文件~~)
1.DFS的剪枝是一个很重要的方面,也是很复杂的;可以先把整体的搜索框架码出来,再进行剪枝处理;
2.第4点是最难理解的,需要自己敲一遍才能理解;

代码展示

//#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#include
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高冷小伙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值