题目:
题目思路:先将木棍长度数组降序排序,dfs前先判断一下是否符合题意,然后进行dfs,dfs出结果就退出,需要剪枝的地方,dfs 用一个参数记录上一次搜索的位置在哪里,下一次搜索只会在这条边之后。搜索完一条边后pos再置为0。
代码:
#include<bits/stdc++.h>
using namespace std;
int l[30];
bool mark[30];
int n,sum,one;
bool cmp(int a,int b)
{
return a>b;
}
int flag=0;
void dfs(int onel,int num,int pos)
{
if(flag==1) return ;
if(num==3){
flag=1;
return ;
}
if(onel == 0){
num++;
onel=one;
pos=0;
}
for(int i=pos;i<n;i++){
if(!mark[i]){
if(onel>=l[i]){
mark[i]=true;//标记为已访问
dfs(onel-l[i],num,i);
mark[i]=false;//未访问
}
}
}
}
int main()
{
fill(mark,mark+30,false);
cin>>n;
int sum=0;
for(int i=0;i<n;i++){
cin>>l[i];
sum+=l[i];
}
one = sum/4;
sort(l,l+n,cmp);
if(l[0]>one||sum%4) cout<<"No"<<endl;
else{
dfs(one,0,0);
if(flag==1) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}