给一串数字,判断是否能凑成正方形的四个边。
裸搜题,不过没有一遍AC。。。。
直接上代码吧。
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> using namespace std; int T,n,sum,len; int info[25]; bool v[25],flag; int dfs(int id,int completed,int length){ if(completed==4)return 1; for(int i=id;i<=n;i++){ if(!v[i]){ if(length-info[i]==0){ v[i]=1; if(dfs(1,completed+1,len)) return 1; v[i]=0; } else if(length-info[i]>0){ v[i]=1; if(dfs(i+1,completed,length-info[i])) return 1; v[i]=0; } } } return 0; } bool cmp(int a,int b){ return a>b; } int main(){ cin>>T; while(T--){ sum = 0; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",info + i); sum+=info[i]; } sort(info+1,info+1+n,cmp); if(sum%4||n<4){ puts("no"); continue; } len = sum/4; memset(v,0,sizeof(v)); if(dfs(0,0,len)) puts("yes"); else puts("no"); } return 0; }