HDU1518 dfs+剪枝

来源:互联网 发布:可视通信网络 编辑:程序博客网 时间:2024/05/14 04:49
#include <stdio.h>#include <algorithm>#include <string.h>int n,a[25],e;bool b[25];bool dfs(int curLen,int cure,int curStick){if(cure==4) return 1;if(curLen==e)return dfs(0,cure+1,0);for(int i=curStick;i<n;++i)//之前的已判断过,从curStick开始{if(i&&a[i]==a[i-1]&&!b[i-1]) continue;//当前长度和前一个一样且前一个不使用,当前也不使用if(b[i]) continue;if(curLen+a[i]>e) break;b[i]=1;if(dfs(curLen+a[i],cure,i))return true;b[i]=0;if(!curLen) break;//一条边的第一个没有匹配,则整个匹配失败}return false;}int main(){int T;scanf(" %d",&T);while(T--){e=0;memset(b,0,sizeof(b));scanf(" %d",&n);for(int i=0;i<n;++i){scanf(" %d",a+i);e+=a[i];}std::sort(a,a+n);if(e%4!=0||a[n-1]>e){printf("no\n");continue;}e/=4;if(dfs(0,0,0))printf("yes\n");elseprintf("no\n");}return 0;}

0 0
原创粉丝点击