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

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





