刚接触搜索,这一题直接看蒙了,上网查的解题报告,重新理一下思路。
首先当所有木棒总长度不能被4整除时以及木棒最大长度大于总长度除以4时,不能组成正方形,直接输出no。
深搜时从第一个开始往后搜索,只要满足当前边长+当前木棒长<正方形边长,就标记该木棒,并继续搜索后面的木棒,当木棒长度=sum/4 时,count加1,当count=3时表明能够成正方形,flag=1,返回,flag=0则不能组成正方形。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 int a[30]; 6 bool visit[30], flag; 7 int n, len; //len边长 8 void dfs(int curl, int pos, int count) //curl当前边长,pos位置 9 { 10 if (curl == len) 11 { 12 ++count; 13 if (count == 3) 14 { 15 flag = 1; 16 return; 17 } 18 curl = pos = 0; 19 } 20 if (flag) 21 return; 22 for (int i = pos; i < n; ++i) 23 if (!visit[i]) 24 { 25 if (curl + a[i] <= len) 26 { 27 visit[i] = 1; 28 dfs(curl + a[i], i, count); 29 visit[i] = 0; 30 } 31 } 32 } 33 int main() 34 { 35 int T; 36 scanf("%d", &T); 37 while (T--) 38 { 39 memset(a, 0, sizeof(a)); 40 memset(visit, 0, sizeof(visit)); 41 scanf("%d", &n); 42 int max = 0, sum = 0; 43 for (int i = 0; i < n; ++i) 44 { 45 scanf("%d", &a[i]); 46 sum += a[i]; 47 if (a[i] > max) 48 max = a[i]; 49 } 50 if (sum % 4 != 0 || max > sum / 4) 51 printf("no\n"); 52 else 53 { 54 len = sum / 4; 55 flag = 0; 56 dfs(0, 0, 0); 57 if (flag) 58 printf("yes\n"); 59 else 60 printf("no\n"); 61 } 62 } 63 system("pause"); 64 return 0; 65 } 66