您的位置:首页 > 其它

POJ_2362_Square

2010-07-17 16:43 375 查看
//1011的简化版,TLE了一次,主要是把变量写错了
#include<stdio.h>
#include<string.h>
//#include<time.h>
#include<algorithm>
using namespace std;
int stick[25],n,sum,end;
bool f[25];
int cmp(const void* _a,const void* _b)
{
int* a=(int *)_a;
int* b=(int *)_b;
return -(*a-*b);
}
int dfs(int ti,int p,int next)
{
if(ti==4)
{
end=1;
return 1;
}
int i,j,last=-1;
for(i=next;i<n;i++)
{
if(!f[i]&&stick[i]!=last)
{
last=stick[i];
if(p+stick[i]<sum/4)
{
f[i]=true;
//把i+1写成了next+1,完全没达到剪枝的效果
dfs(ti,p+stick[i],i+1);
f[i]=false;
}
if(p+stick[i]==sum/4)
{
f[i]=true;
dfs(ti+1,0,0);
f[i]=false;
}
if(end)
return 1;
if(next==0)
return 0;
}
}
return 0;
}
int decide()
{
end=0;
memset(f,0,sizeof(f));
return dfs(0,0,0);
}
int main()
{
//freopen("square.txt","r",stdin);
//freopen("out.txt","w",stdout);
int test;
scanf("%d",&test);
while(test--)
{
scanf("%d",&n);
int i,j;
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&stick[i]);
sum+=stick[i];
}
qsort(stick,n,sizeof(stick[1]),cmp);
if(sum%4!=0)
printf("no/n");
else
{
if(stick[0]>sum/4)
printf("no/n");
else
{
if(decide())
printf("yes/n");
else
printf("no/n");
}
}
//printf("%f/n",(double)clock()/CLOCKS_PER_SEC);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: