Square
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5695 Accepted Submission(s): 1804
3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5
yes no yes
思路:DFS+剪枝
DFS刚接触有点搞不透 啊,参考别人代码写的。
#include<iostream>
using namespace std;
#define max(a,b) a>b? a:b
int a[23],n,sum,aver,maxn;
bool b[23],flag;
void dfs(int s,int cnt,int j)
{
if(s==aver)
{
cnt++;
if(cnt==4)
{
flag=true;
return ;
}
else
s=0;
j=0;
}
if(flag)return ;
for(int i=j;i<n;i++)
{
if(!b[i]&&s+a[i]<=aver)
{
b[i]=true;
dfs(s+a[i],cnt,i);
b[i]=false;
}
}
}
int main()
{
int t,i;
cin>>t;
while(t--)
{
cin>>n;
sum=maxn=0;
for(i=0;i<n;i++)
{
cin>>a[i];
sum=sum+a[i];
maxn=max(a[i],maxn);
b[i]=false;
}
if(sum%4!=0||maxn>sum/4)
cout<<"no"<<endl;
else
{
flag=false;
aver=sum/4;
dfs(0,0,0);
if(flag)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
}
return 0;
}