problem description
Feynman手上有一些小木棍,它们长短不一,Feynman想用这些木棍拼出一个等边三角形,并且每根都要用到,请问他能成功吗?
输入格式
首先输入一个整数n(3<=n<=20)表示木棍的数量,接下来输入n根木棍的长度pi(1<=pi<=10000)
输出格式
如果Feynman能拼出等边三角形,输出"yes"
,否则输出"no"
。
样例输入1
5
1 2 3 4 5
样例输出1
yes
样例输入2
4
1 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;
}