hdu1518 Square | ZOJ1909 | POJ2362 (dfs + 剪枝)
2013-07-19 08:26
302 查看
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1518
题意:给你n根木棒,问用光所有的木棒能否拼成正方形。
dfs
剪枝:
1、当搜到三条边的时候,第四条边也就确定了。这时就找到解了,可以停止搜索了。
2、由于每一根木棒都要使用,所以在搜第一条边的时候可以直接拿第一根木棒作为这条边的头一根木棒。
3、搜索完毕后,若下一个搜索的数仍与当前相同,则寻找下一个不同的数进行搜索。
hdu 上 46MS 挤到第一版啦。 \(≧▽≦)/
题意:给你n根木棒,问用光所有的木棒能否拼成正方形。
dfs
剪枝:
1、当搜到三条边的时候,第四条边也就确定了。这时就找到解了,可以停止搜索了。
2、由于每一根木棒都要使用,所以在搜第一条边的时候可以直接拿第一根木棒作为这条边的头一根木棒。
3、搜索完毕后,若下一个搜索的数仍与当前相同,则寻找下一个不同的数进行搜索。
hdu 上 46MS 挤到第一版啦。 \(≧▽≦)/
#include <cstdio> #include <cstring> #include <functional> #include <algorithm> #define N 25 using namespace std; int ave, n; bool flag; bool vis ; int a ; void dfs( int sum, int k, int cnt) { if(flag) return; if(cnt==3) { flag = true; return; } for(int i=k+1; i<=n; i++) if(!vis[i]&&!flag&&sum+a[i]<=ave) { vis[i] = 1; if(sum+a[i]==ave) dfs(0,0,cnt+1); else dfs(sum+a[i],i,cnt); vis[i] = 0; if(sum==0) break; while(a[i]==a[i+1]) i++; } } int main() { int T, i, s; scanf("%d",&T); while(T--) { s = 0; memset(vis,0,sizeof(vis)); scanf("%d",&n); for(i=1; i<=n; i++) { scanf("%d",a+i); s +=a[i]; } sort(a+1,a+n+1,greater<int>()); flag = false; if(s%4==0) { ave = s/4; dfs(0,0,0); } if(flag) printf("yes\n"); else printf("no\n"); } return 0; }
相关文章推荐
- HDU1518 & POJ2362 & ZOJ1909 Square(DFS,剪枝是关键呀)
- ZOJ1909 POJ2362 HDU1518 Square,很经典的DFS+剪枝!
- hdu1518(DFS+剪枝 Square )
- DFS:HDU1518-Square(剪枝较多的DFS)
- 【DFS+剪枝】-ZOJ-3631-Watashi's BG
- ZOJ - 1492 dfs剪枝求最大团
- zoj 1909 Square
- poj 2362 Square(dfs, 剪枝)
- poj2362 dfs 剪枝 比水题难的题
- hdoj 1518 Square 【dfs+剪枝】
- hdu1518 Square(dfs)
- ZOJ2100题解这是我整整意义上的第一道DFS题能做出来我很开心,和上题一样,方法思路大体相同,不过不需要剪枝。
- zoj 1008 dfs 一种巧妙的剪枝
- zoj 2110 dfs,剪枝
- hdu 1518 Square【DFS+剪枝】
- HDU1518:Square(DFS)
- zoj 1909 Square 不能编译求指导!!
- HDU1518:Square(DFS)
- zoj 1909 || poj 2362 Square
- poj 1564 Sum It Up | zoj 1711 | hdu 1548 (dfs + 剪枝 or 判重)