hdu1518深搜DFS
看队友ac了这个。。加上很久没写过深搜了。。手痒了。。遂拿之解闷~~
一开始超时。。玩命的超时(这次用的printf了)。。查之发现二逼了代码在已经搜过的位置重复搜了几次。。导致代码目测时间复杂度为o(n!)。。玩命啊。。改之。。wa。。顿时想起以前做过之一题目。。即在搜索过程中搜不成功还得回溯。。遂改方法。。ac~
#include<iostream> #include<algorithm> using namespace std; const int MAXM=22; int m; int num[MAXM]; bool vis[MAXM]; bool cmp(int a,int b) { return a>b; } bool dfs(int remd,int pos,int count,int len) { int i; if(count==4) { return 1; } for(i=pos;i<=m-1;i++) { if((!vis[i])&&remd>=num[i]) { vis[i]=1; remd=remd-num[i]; if(remd==0&&dfs(len,0,count+1,len)) { return 1; }else if(dfs(remd,i+1,count,len)) { return 1; } remd=remd+num[i]; vis[i]=0; } } return 0; } int main() { int t; scanf("%d",&t); while(t--) { int i; memset(vis,0,sizeof(vis)); int sum=0; scanf("%d",&m); for(i=0;i<=m-1;i++) { scanf("%d",&num[i]); sum+=num[i]; } if(sum%4) { printf("no\n"); continue; } sort(num,num+m,cmp); if(sum/4<num[0]) { printf("no\n"); continue; } if(dfs(sum/4,0,0,sum/4)) { printf("yes\n"); }else { printf("no\n"); } } return 0; }
本博客(http://www.cnblogs.com/cj695/)未标明转载的内容均为本站原创,非商业用途转载时请署名(77695)并注明来源(http://www.cnblogs.com/cj695/)。商业用途请联系作者(77695) QQ:646710030。作者(77695)保留本博客所有内容的一切权利。
独立博客:http://nfeng.cc/
独立博客:http://nfeng.cc/