博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU-1518 Square dfs+剪枝
阅读量:6999 次
发布时间:2019-06-27

本文共 1633 字,大约阅读时间需要 5 分钟。

该题问给定的棍子能否组成一个正方形。首先我们要判定是否总长度是4的倍数,然后再决定是否存在某条边大于组合边长。

搜索的过程中也是可以进行剪枝了。

首先将边排序,我们可以假定所有的组合边由大小递减的边组成,那么我们在搜索的时候就不用再往前找边了。

其次我们可以确定任何一条边都一定在一条组合边中,那么当我们以任意一条边开搜的情况下无解的话,那么我们就可以直接返回no了。

最后在搜索某条边无解的情况下,我们可以把相同大小的边略过,因为前面相同长度的边都无法安排出一种方案,在少一条相同边情况下肯定也就无法给出安排了。

代码如下:

#include 
#include
#include
#include
using namespace std;int N, seq[25], use[25], mode;bool dfs(int cap, int last, int num){ if (num == N) { return true; } if (cap == 0) { if (dfs(mode, N+1, num)) { return true; } else { return false; } } else { for (int i = last-1; i >= 1; --i) { if (cap >= seq[i] && !use[i]) { use[i] = 1; if (dfs(cap-seq[i], i, num + 1)) { return true; } else { use[i] = 0; if (i == N) { return false; } while (seq[i-1] == seq[i]) --i; } } } } return false;}int main(){ int T, sum, Max; scanf("%d", &T); while (T--) { sum = 0, Max = -1; memset(use, 0, sizeof (use)); scanf("%d", &N); for (int i = 1; i <= N; ++i) { scanf("%d", &seq[i]); Max = max(Max, seq[i]); sum += seq[i]; } if (sum % 4 != 0 || Max > sum / 4) { puts("no"); continue; } sort(seq+1, seq+N+1); mode = sum / 4; // 每一边的大小 printf(dfs(mode, N+1, 0) ? "yes\n" : "no\n"); } return 0;}

转载地址:http://fsevl.baihongyu.com/

你可能感兴趣的文章
python中匹配中文,解决不匹配,乱码等问题
查看>>
集合框架总结
查看>>
大师源于勤奋
查看>>
mysql触发器语法的一个实例
查看>>
线程同步
查看>>
js unicode处理
查看>>
js身份证验证类
查看>>
htmlspecialchars_decode
查看>>
从Handler+Message+Looper源代码带你分析Android系统的消息处理机制
查看>>
golang 的glide包管理使用技巧教程
查看>>
C#设计模式之三抽象工厂模式(AbstractFactory)【创建型】
查看>>
Linux I2C驱动分析(三)----i2c_dev驱动和应用层分析 【转】
查看>>
三分钟彻底禁用、隐藏Android设备底部虚拟按钮(亲测有效)
查看>>
零复制(zero copy)技术
查看>>
java语言编程使用正则表达式来实现提取(美团 3-5年经验 15-30k 北京 hadoop高级工程)中的3-5和15-30...
查看>>
[js高手之路]匀速运动与实例实战(侧边栏,淡入淡出)
查看>>
adb protocol failure【转】
查看>>
25.Linux-Nor Flash驱动(详解)
查看>>
Appium 解决中文输入问题
查看>>
ping正常但是ssh到linux服务器很卡的解决方法
查看>>