题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1518
思路:DFS+剪枝
这题一直想了好久没做出来,最后想到DFS,交了两次都TLE了 (+ . +)|||............
没办法,看别人的解题报告了,也是DFS ,有些地方优化了,终于AC了 ^0^……
#include<iostream> #include<cstdio> using namespace std; #define max(a,b) (a)>(b)?(a):(b) int a[23],n,sum,aver,maxn; bool b[23],flag; void dfs(int mySum,int Count,int j) { if(mySum==aver) { Count++; if(Count==4) { flag=true; return; } else mySum=0; j=0; } if(flag) return;//在此处纠结了,避免不必要的时间损耗,没它时我TLE了 for(int i=j;i<n;i++) { if(!b[i]&&mySum+a[i]<=aver) { b[i]=true; dfs(mySum+a[i],Count,i); b[i]=false; } } } int main() { int T,i; scanf("%d",&T); while(T--) { scanf("%d",&n); sum=maxn=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; maxn=max(a[i],maxn); b[i]=false; } if(sum%4!=0||maxn>sum/4)//简单判断、不满足的直接给出结果 printf("no\n"); else { flag=false; aver=sum/4; dfs(0,0,0); if(flag) printf("yes\n"); else printf("no\n"); } } return 0; }