PKU1011 Sticks

    这是一道比较经典的搜索题目,运用到了深度优先搜索。

    首先,我们显然要先对题目中的n个数据所在数组a进行排序。

    接着,我们进行题目的分析。我们要求最小的可能木棒长度,于是就从小到大枚举这一长度。显然长度len的下限为n个数据中最长的小木棒的长度;上限是所有n个数据长度总和。另外我们还要开一个sum数组,用于记录当前长度为i的小木棒剩余的个数,也相当于通常所用的vis数组。此外,我们使用b数组记录所有的不同长度,便于我们快速地进行选择可用小木棒长度。

    以上的操作均是运用空间换时间的思想,降低了搜索过程中的常数大小。但想要在时间限制内通过所有测试数据,高效的搜索技巧势在必行。

    先考虑一下搜索顺序——对于数组a中的小木棒我们是要递增搜索还是递减搜索。只要想象一棵搜索树就能发现,如果采用递减搜索可以避免重复搜索,减少搜索量,利于提高稍后剪枝的效率。

    再想想这道题目本身——如果有这么一段小木棒,将它放到已经积累了一部分的初始木棒后恰好填满长度len,那么我们就是用它。因为没有其他的组合比这个小木棒更有可能得到正解了。

    此外如果在确定一个初始木棒的组成时,搜索当前可用最长小木棒时发现要回溯到更小的木棒,那就exit剪掉它。原因显而易见——如果当前不用这个最长小木棒,那么以后也必须要用到,且还会得不到正解而回溯。所以这种情况时一定要剪枝的,而且这个剪枝的高效性不言而喻,它就是这道题的题眼!

    这样这道题目我们就完美地解决了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值