等边三角形(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
原创粉丝点击