HDOJ搜索专题之Square
题目大意:给定n个正整数,问能否分成4组,且每组的和相等。
分析:这题就是sticks那题的简化版。思路一样。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 #include <vector> 5 #define N 20 6 using namespace std; 7 vector<int> edge[4]; 8 int len[N],n,sum; 9 char vis[N],yes; 10 int cmp(const void*a,const void*b) 11 { 12 return *(int*)b-*(int*)a; 13 } 14 void dfs(int k,int l) 15 { 16 int i; 17 if(l==sum/4) 18 { 19 dfs(k+1,0); 20 return; 21 } 22 if(k==4 && l==0) 23 { 24 yes=1; 25 return; 26 } 27 if(l==0) 28 { 29 if(k==0) i=0; 30 else i=edge[k-1].front()+1; 31 for(;i<n && vis[i];i++); 32 if(i<n && len[i]<=sum/4) 33 { 34 vis[i]=1; 35 edge[k].push_back(i); 36 dfs(k,len[i]); 37 edge[k].pop_back(); 38 vis[i]=0; 39 } 40 } 41 else 42 { 43 for(i=edge[k].back()+1;!yes && i<n;i++) 44 { 45 if(vis[i] || len[i]+l>sum/4) continue; 46 vis[i]=1; 47 edge[k].push_back(i); 48 dfs(k,l+len[i]); 49 edge[k].pop_back(); 50 vis[i]=0; 51 if(len[i]+l==sum/4) break; 52 } 53 } 54 } 55 int main() 56 { 57 int t,i; 58 scanf("%d",&t); 59 while(t--) 60 { 61 scanf("%d",&n); 62 sum=0; 63 for(i=0;i<n;i++) scanf("%d",&len[i]),sum+=len[i]; 64 qsort(len,n,sizeof(len[0]),cmp); 65 for(i=0;i<4;i++) edge[i].clear(); 66 memset(vis,0,sizeof(vis)); 67 yes=0; 68 if(sum%4==0) dfs(0,0); 69 if(yes) puts("yes"); 70 else puts("no"); 71 } 72 return 0; 73 }