等边三角形(dfs剪枝)

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
#include
#include
#include
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>arr[i];
		sum+=arr[i];
	}
	if(sum%3==0){
		dfs(0,0,0,0);
		if(flag) cout<<"yes"<


你可能感兴趣的:(DFS)