hoj1956 square
http://acm.hit.edu.cn/hoj/problem/view?id=1956
深搜+剪枝,与hoj 1049相似,此题固定了 筷子的长度和筷子的条数为4
/*This Code is Submitted by billforum for Problem 1956 at 2012-01-31 17:30:00*/ #include <iostream> #include <algorithm> using namespace std; struct point { int num; int next; }; point data[100]; bool visit[100]; int total,len,n; bool cmp(point x,point y) { return (x.num>y.num); } bool dfs(int res,int next,int cpl) { if(res==len) { res=0; cpl++; next=1; } if(cpl==total) return true; int i=next; while(i<n) { if(visit[i]) { i++; continue; }//if if(data[i].num+res<=len) { visit[i]=1; if(dfs(data[i].num+res,i+1,cpl)) return true; visit[i]=0;// if(res==0) break;//剪枝 if(res+data[i].num==len) break;//剪枝 i=data[i].next; continue; }//if i++; }//while return false; } int main(int args,char** argv) { int ind,id,sum,test,flag; cin>>test; while(test--) { sum=0; flag=0; cin>>n; for(int i=0;i<n;i++) { cin>>ind; data[i].num=ind; sum+=ind; visit[i]=0; } sort(data,data+n,cmp); id=0; while(id<n) { int j=id+1; while((data[j].num==data[id].num)&&j<n) j++;//j?=n for(int i=id;i<j;i++) data[i].next=j; id=j; }//while if(sum%4==0) { len=sum/4; total=4; if(dfs(0,0,0)) flag=1; } if(flag==0) cout<<"no"<<endl; else cout<<"yes"<<endl; }//while return 0; }