经典搜索 剪枝 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; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步