Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 9930 Accepted Submission(s): 3254
3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5
yes no yes
#include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<queue> #include<stack> #include<algorithm> using namespace std; bool cmp(int x,int y) { return x>y; } int aver; int stick[21]; int visit[21]; int n; int exist;//判断是否匹配成功 void dfs(int have,int num,int pos)//分别记录已匹配长度 已经匹配组数 当前搜索序号 { int i,j; if(num==4) { exist=1; return ; } for(i=pos;i<n;i++) { if(i&&!visit[i-1]&&stick[i]==stick[i-1])//剪枝 continue; if(visit[i]) continue; if(have+stick[i]==aver) { visit[i]=1; dfs(0,num+1,0); visit[i]=0; } else if(have+stick[i]<aver) { visit[i]=1; dfs(have+stick[i],num,i+1); visit[i]=0; } if(have==0)//节约时间的一步,若当前匹配失败 即使已经匹配成3对 也要跳出循环 break;//没有这句话跑800多ms 有的话只用78ms } } int main() { int t; int sum; int i,j; scanf("%d",&t); while(t--) { scanf("%d",&n); sum=0; for(i=0;i<n;i++) { scanf("%d",&stick[i]); sum+=stick[i]; } if(sum%4!=0) { printf("no\n"); continue; } aver=sum/4; sort(stick,stick+n,cmp); if(stick[0]>aver) { printf("no\n"); continue; } memset(visit,0,sizeof(visit)); exist=0; dfs(0,0,0); if(exist) printf("yes\n"); else printf("no\n"); } return 0; }