等边三角形(dfs剪枝)
来源:互联网 发布:马伯庸 知乎 编辑:程序博客网 时间:2024/04/30 15:03
problem description
Feynman手上有一些小木棍,它们长短不一,Feynman想用这些木棍拼出一个等边三角形,并且每根都要用到,请问他能成功吗?
输入格式
首先输入一个整数n(3<=n<=20)表示木棍的数量,接下来输入n根木棍的长度pi(1<=pi<=10000)
输出格式
如果Feynman能拼出等边三角形,输出"yes"
,否则输出"no"
。
样例输入1
51 2 3 4 5
样例输出1
yes
样例输入2
41 1 1 1
样例输出2
no
思路
用递归思想(dfs)进行深搜,不用vis数组标记,直接剪枝三条边:
dfs(cur+1,a+arr[cur],b,c);
dfs(cur+1,a,b+arr[cur],c);
dfs(cur+1,a,b,c+arr[cur]);
边界条件为:
if(a>sum/3||b>sum/3||c>sum/3) return ;
if(a==b&&b==c&&a==sum/3) flag++;
代码示例
#include<iostream>#include<cstdio>#include<stdlib.h>#include<string>using namespace std;int arr[21];//int vis[21];int n,sum,flag;void dfs(int cur,int a,int b,int c){if(flag==1) return ;if(cur>n) return ;if(a>sum/3||b>sum/3||c>sum/3) return ;if(a==b&&b==c&&a==sum/3) flag++;dfs(cur+1,a+arr[cur],b,c);dfs(cur+1,a,b+arr[cur],c);dfs(cur+1,a,b,c+arr[cur]);}int main(){sum=0;flag=0;cin>>n;for(int i=0;i<n;++i){cin>>arr[i];sum+=arr[i];}if(sum%3==0){dfs(0,0,0,0);if(flag) cout<<"yes"<<endl;else cout<<"no"<<endl;}else cout<<"no"<<endl;return 0;}
1 0
- 等边三角形(dfs剪枝)
- DFS(剪枝)_hdu_1010
- Friends(DFS+剪枝)
- hdu5113(dfs+剪枝)
- hdu1010(dfs+剪枝)
- dfs+剪枝(hdu1010)
- HDU5937(DFS+剪枝)
- Cubes(DFS+剪枝)
- hdu1010(dfs+剪枝)
- POJ2248Addition Chains(dfs+剪枝)
- hdu 1010 (DFS+剪枝)
- poj1190生日蛋糕(dfs+剪枝)
- HDOJ(1010)DFS+剪枝
- Zipper(poj2192)dfs+剪枝
- Sticks(DFS+剪枝+贪心)
- POJ-2078(dfs + 剪枝)
- dfs去重(剪枝)
- hdu1010 (dfs+奇偶剪枝)
- CSDN-Step_00_Demo
- PowerDesigner中Name与Code同步的问题
- node.js 学习第十三天 fs 文件模块
- 7大系统设置让黑客进不来绕道走
- 第三方空件的运用(文本域)
- 等边三角形(dfs剪枝)
- android 组件化开发
- 英语总结—2017年3月
- 深度优先搜索--迷宫可能路径--栈
- java中Scanner类next()和nextline()注意事项
- Android App响应时间测试方法研究
- 【Java基础】java中常用关键字理解this、static、final、volatile理解
- vim的使用
- 能量管理EMS 思维导图