#include<iostream>
#include<bits/stdc++.h>
using namespace std;
static int n,average;
int k[20];
int flag=0;
int visit[20];
void dfs(int onel,int num,int pos)
{
if(flag==1)
return;
if(num==4)
{
flag=1;
return; //如果前3边已经=average,num加到4了,则已经成功了。
}
if(onel==0) //onel从average减到0
{
onel=average;
num++;
pos=0;
}
for(int i=pos;i<n;i++) //对一条边进行操作,就取每一根都来试一试,并以此种可能作为可能性进行递归。标准写法。
{
if(onel-k[i]>=0)
if(visit[i]==0)
{
visit[i]=1;
dfs(onel-k[i],num,i);
visit[i]=0;
}
}
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>k[i];
int sum=0;
for(int i=0;i<n;i++)
sum+=k[i];
if(sum%4!=0)
{
cout<<"No";
return 0;
}
average=sum/4;
dfs(average,1,0);
if(flag)
cout<<"Yes";
else
cout<<"No";
return 0;
}
【蓝桥杯-dfs】正方形(一条边一条边dfs)
最新推荐文章于 2024-03-22 19:56:45 发布