POJ 2362 POJ1011解题报告

两题有异曲同工之妙 觉得是DFS上的一种里程碑 在DFS递归了解得透彻的情况下 这两题的关键就在于数学思维了 刚开始写的代码总是过不了特殊数据 就开始意识到原来数学上的思维就已经不是完善的。以后要细心分析数学上的每一种可能和情况啊!

POJ2362

给出一组数据 问能否组成正方形,刚开始我数学上的逻辑就存在错误 我是先按从大到小快排从数组的第一个元素开始 去寻找他的“搭档”如果成功了就把这些元素标记为1,事实上这是错误的 因为后面的棍子可能需要和前面标记过的棍子组成边长 所以一定要全部元素都要DFS 不放过 如果后面的棍子无法组成边长了 前面的已经成功的棍子就必须拆开来寻找其他组合 再递归下去,,因为这个WA了很久 教训很深刻!!以后DFS当不行的时候一定要(回溯)!!

例如一组数据14:

20 19 17 17 16 15 12 10 10 9 5 5 4 1

如果不回溯的话《20 19 1》

《17 9 4》

然后就配不下去了,这时候就要拆开原来的组合,重新选择 最后正确组合是(20 15 5 ),(19 17 4 ),( 17 12 10 1 ), ( 16 10 9 5 )不要前面成功就定死了前面的元素。还有因为小的棍子更灵活 组成边长需要的步骤更多。所以要排序提高效率。

AC代码(没剪枝)

[code=C/C++]

 

[/code]

POJ 1011

2362强化版

思维和2362一样用DFS全部搜索 不过这题对剪枝要求高!

目前我想到的剪枝

1,原始棍长要被总长度整除,否则跳过

2,因为每根棍子肯定要用到,所以如果有一根棍子找不到“搭档”组成原始长度,那么放弃这个原始长度,到下一个

3,如果搜索到某根棍子 并且这根棍子无法满足条件(递归下去所有小棍子都能组成原始长度),那么后面如果再遇到这个长度的棍子则跳过!

就这些了、

AC代码


经验总结,额,因为加上剪枝的时候 有时候没控制好变量和条件,使原先可能的情况也被剪枝掉了,原因是总结确实变量掌握还有点迟钝,以后每加语句都要深深思考有什么例外情况没判断到,,否则调试要浪费很多时间了。5555555555

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值