HDU 1518 Square 深搜
http://acm.hdu.edu.cn/showproblem.php?pid=1518
题意:
给出M根棍子,要将所有棍子用上,拼成一个正方形。
坑爹:
用深搜时递归容易超时。
解法:
剪枝:用一个pos来记录当前搜索到的位置,当下次继续加一个棍子时从pos位置开始,因为前面的可以加的都已经标记过了,而每递归一次都要从头
开始搜索,浪费了很多时间。

1 #include<iostream> 2 using namespace std; 3 4 const int maxn = 20 + 10; 5 int num[maxn]; 6 bool used[maxn]; 7 int M; 8 int sum; 9 int flag; 10 11 int DFS(int d,int cnt,int pos) 12 { 13 if(d == sum) 14 { 15 d=0; 16 pos=0; 17 cnt++; 18 } 19 if(cnt == 4) 20 { 21 flag = 1; 22 return 1; 23 } 24 int i; 25 for(i=pos; i<M; i++) 26 { 27 if(!used[i]) 28 { 29 used[i] = 1; 30 if(num[i]+d <= sum) 31 { 32 if(DFS(num[i]+d,cnt,i+1) == 1) 33 { 34 return 1; 35 } 36 } 37 used[i] = 0; 38 } 39 } 40 return 0; 41 } 42 43 int main() 44 { 45 int N; 46 cin>>N; 47 while(N--) 48 { 49 memset(used,0,sizeof(used)); 50 int i; 51 sum = 0; 52 cin>>M; 53 for(i=0; i<M; i++) 54 { 55 cin>>num[i]; 56 sum += num[i]; 57 } 58 if(sum%4 != 0) 59 { 60 cout<<"no"<<endl; 61 continue; 62 } 63 sum/=4 ; 64 flag=0; 65 DFS(0,0,0); 66 if(flag) 67 { 68 cout<<"yes"<<endl; 69 } 70 else 71 { 72 cout<<"no"<<endl; 73 } 74 } 75 return 0; 76 }