hdu 1518 Square
阿新 • • 發佈:2019-01-25
dfs要剪枝不然超時
剪枝:將木棒的長度排序,每個邊的木棒都是從小到大,減去了每條邊木棒不是升序的情況
搜尋(1+7)了,(7+1)就不用了
#include<stdio.h> #include<stdlib.h> int n,a[30],vis[30],L; int cmp(const void *a,const void *b) { return *(int *)a-*(int *)b; } int dfs(int ans,int sum,int num) { int i; if(ans==3)return 1; for(i=num;i<n;i++) { if(vis[i])continue; if(sum+a[i]==L) { vis[i]=1; if(dfs(ans+1,0,0)==1)//找到了相等的,就找沒用過最小的木棒繼續,所以num從0開始 return 1; vis[i]=0; } if(sum+a[i]<L) { vis[i]=1; if(dfs(ans,sum+a[i],i)==1)//只找比a[i]大的與a[i]組合,所以num從i開始 return 1; vis[i]=0; } } return 0; } int main() { int i,j,m,t; scanf("%d",&t); while(t--) { m=0; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%d",&a[i]); m+=a[i]; } L=m/4; if(m%4!=0) { printf("no\n"); continue; } qsort(a,n,sizeof(a[0]),cmp); for(i=0;i<n;i++) vis[i]=0; if(dfs(0,0,0)==1)printf("yes\n"); else printf("no\n"); } return 0; }