您的位置:首页 > 其它

ZOJ 1909 Square (DFS + 剪枝)

2014-03-26 22:28 309 查看
一开始TLE,加了剪枝后不断WA,一直没找出原因 = = !

暂时贴上保存了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct ss{
int val;
int sum;
};
ss a[22];
int tol,s,cnt;

int cmp(ss a,ss b)
{   return a.val>b.val; }
void dfs(int t,int len,int index)
{
if(len==s){
cnt++;
len=0;
index=0;
}
if(cnt==3)return;

for(int i=index;i<tol;i++)
{
if(len+a[i].val<=s&&a[i].sum>0){
if(cnt==3)return;
//           printf("%d %d %d\n",t,a[i].val,len);
a[i].sum--;
dfs(t+1,len+a[i].val,i);
a[i].sum++;
}
}

}
int main()
{
int t,i,j,n;
cin>>t;
while(t--)
{
cin>>n;
for(i=0;i<n;i++){
a[i].val=-1;
a[i].sum=0;
}
tol=0;
s=0;
for(i=0;i<n;i++)
{
int p;
cin>>p;
s+=p;
for(j=0;j<tol;j++)
{
if(a[j].val==p){
a[j].sum++;
break;
}
}
if(j==tol){
a[tol].val=p;
a[tol].sum=1;
tol++;
}

}
if(s%4!=0)
{
printf("no\n");
continue;
}
sort(a,a+tol,cmp);
if(a[0].val>s/4){
printf("no\n");
continue;
}
//    for(i=0;i<tol;i++)printf("***%d %d\n",a[i].val,a[i].sum);
s/=4;
cnt=0;
dfs(0,0,0);
if(cnt==3)printf("yes\n");
else printf("no\n");

}

return 0;
}
/*
3
4 1 1 1 1
5 10 20 30 40 50
8 1 7 2 6 4 4 3 5
*/


最后参考了大牛的思路http://blog.csdn.net/xsbailong/article/details/6844603

AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct ss{
int val;
int sum;
};
ss a[22];
int tol,s,cnt,f;

int cmp(ss a,ss b)
{   return a.val>b.val; }
void dfs(int rest ,int summ,int index)
{
if(summ==s){
f=1;
return;
}
for(int i=index;i<tol;i++)
{
if(a[i].val<=rest&&a[i].sum>0){
a[i].sum--;
if(a[i].val==rest)
{
dfs(s,summ-rest,0);
}
else {
dfs(rest-a[i].val,summ-a[i].val,i);
}
a[i].sum++;
if(rest==s)return;
}
}

}
int main()
{
int t,i,j,n,maxi;
cin>>t;
while(t--)
{
cin>>n;
tol=0;
s=0;
maxi=-1;
for(i=0;i<n;i++)
{
int p;
cin>>p;
s+=p;
for(j=0;j<tol;j++)
{
if(a[j].val==p){
a[j].sum++;
break;
}
}
if(j==tol){
a[tol].val=p;
a[tol].sum=1;
tol++;
if(maxi<p)maxi=p;
}

}
if(s%4!=0||maxi>s/4)
{
printf("no\n");
continue;
}
sort(a,a+tol,cmp);

//    for(i=0;i<tol;i++)printf("***%d %d\n",a[i].val,a[i].sum);
s/=4;
f=0;
dfs(s,s*4,0);
if(f)printf("yes\n");
else printf("no\n");

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: