经典搜索 剪枝 hdu 1518 Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square?
主要是剪枝:分为总体和枝节
总体:sum%4!=0,max<sum/4
枝节:在于dfs的参数设置和条件判断,动态的判断是否进行
参考代码(参考牛人的):
#include <stdio.h> #include <stdlib.h> #include <string.h> int a[25],vist[25],m,ave,flag; int cmp(const void *a,const void *b) { return (int *)b-(int *)a; } int dfs(int res,int sums,int cur) { int i; if(sums==ave) return 1; for(i=cur;i<m;i++) { if(a[i]==a[i-1]&&!vist[i-1])//相邻的相等的前者没有加入,则这个也不行 continue; if(!vist[i]&&a[i]<=res) { vist[i]=1; if(a[i]==res) { if(dfs(ave,sums-a[i],0)) { // printf("%d\n",i); return 1; } } else if(dfs(res-a[i],sums-a[i],i)) { return 1; } vist[i]=0; if(res==ave)//ave没变,则表示不存在 return 0; } } return 0; } int main() { int n,i,sum; scanf("%d",&n); while(n--) { scanf("%d",&m); sum=0; for(i=0;i<m;i++) { scanf("%d",&a[i]); sum+=a[i]; } qsort(a,m,sizeof(int),cmp); flag=0; ave=sum/4; if(a[m-1]>ave||sum%4) { printf("no\n"); continue; }else { memset(vist,0,sizeof(vist)); if(dfs(ave,sum,0)) flag=1; } if(flag) printf("yes\n"); else printf("no\n"); } return 0; }