HDU1518(深搜+剪枝)
来源:互联网 发布:淘宝店更改主营类目 编辑:程序博客网 时间:2024/05/24 05:27
尝试了一下书上的代码。发现新的写法
再次此前我都是定义一个全局变量flag代表是否搜到结果,如果搜到结果就return,最终返回main。而书上则是把return写在进入下一层搜索的if语句中。
/** * hdu1518 * 深搜+剪枝 * * 剪枝方法: * 1。木棍数和是4的倍数 * 2。在1。满足的情况下找到三个边,第四个边不用找了 * 3。可以从大数开始找 */#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int mmax = 25;int l;int n;int sticks[mmax];bool visit[mmax];//第一次见这种巧妙写法,还是得多想呀bool dfs(int k, int len, int cnt){ if(cnt == 3) { return true; } for(int i = k; i >= 0; i--) { if(!visit[i]) { visit[i] = 1; if(len + sticks[i] == l) { if(dfs(n-1, 0, cnt+1)) { return true; } } else if(len + sticks[i] < l) { if(dfs(i-1, len+sticks[i], cnt)) { return true; } } visit[i] = false; } } return false;}int main(){ int t; scanf("%d", &t); while(t--) { memset(visit, 0, sizeof(visit)); int sum = 0; scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d", &sticks[i]); sum += sticks[i]; } l = sum / 4; sort(sticks, sticks+n); //剪枝 if(sum % 4 != 0 || n < 4 || l < sticks[n-1]) { printf("no\n"); continue; } if(dfs(n-1, 0, 0)) printf("yes\n"); else printf("no\n"); } return 0;}
阅读全文
0 0
- HDU1518(深搜+剪枝)
- hdu1518(Square)深搜+剪枝
- hdu1518(DFS+剪枝 Square )
- HDU1518 dfs+剪枝
- HDU1518 Square 【剪枝】
- DFS:HDU1518-Square(剪枝较多的DFS)
- hdu1518 Square | ZOJ1909 | POJ2362 (dfs + 剪枝)
- HDU1518 Square (DFS)
- HDU1518 Square(DFS)
- hdu1518
- hdu1518
- HDU1518
- hdu1518
- ZOJ1909 POJ2362 HDU1518 Square,很经典的DFS+剪枝!
- HDU1518 & POJ2362 & ZOJ1909 Square(DFS,剪枝是关键呀)
- hdu1010(深搜 +剪枝)
- HDOJ1010(深搜+剪枝)
- HDU1518——Square(正方形问题)
- 【牛客网】字符串碎片
- 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 F. Overlapping Rectangles(扫描线)
- 距离的总和(搜狗2017秋招真题)
- Constructing Roads
- CodeForces
- HDU1518(深搜+剪枝)
- matlab画圆并生成随机数
- 转载:什么是CDN及CDN加速原理
- 7. Reverse Integer
- na(斐波那契数列对于的模的周期性)
- org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFacto
- Linux下安装nginx
- VB SQL 操作通式
- SharedPreferences存储微技巧