题目来源:点击打开链接
dfs,注意剪枝。比如加起来余4要等于0,网上许多题解讲的比较详细。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
bool visited[25];
int stick[25];
int des_len;
int sticknum;
bool cmp(int a,int b)
{
return b>a;
}
bool dfs(int len,int s,int num)
{
if(num==4)
return 1;
int res=-1;
for(int i=s;i<sticknum;i++)
{
if(visited[i]||stick[i]==res)
continue;
visited[i]=1;
if(len+stick[i]<des_len)
{
if(dfs(len+stick[i],i+1,num))
return 1;
}
else if(len+stick[i]==des_len)
{
if(dfs(0,0,num+1))
return 1;
}
visited[i]=0;
res=stick[i];
if(len==0)
return 0;
}
return 0;
}
int main()
{
int testcase;
cin>>testcase;
while(testcase--)
{
memset(stick,0,sizeof(stick));
memset(visited,0,sizeof(visited));
int sum=0;
cin>>sticknum;
for(int i=0;i<sticknum;i++)
{
cin>>stick[i];
sum+=stick[i];
}
sort(stick,stick+sticknum,cmp);
des_len=sum/4;
if(des_len*4==sum && dfs(0,0,0))
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}