poj 2362
题目大意:给出一些数,问你能不能把这些数,分成4堆,没堆的和相等
解决:dfs+回溯,此题用的剪枝稍微少一些就不行
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <functional> using namespace std; int num[30],ave,n; bool found; bool vis[30]; bool check() { for(int i=0;i<n;i++)if(!vis[i])return false; return true; } void dfs(int p,int cur_sum,int heap) { if(found)return; if(heap==4 && check()){ found=true; return; } for(int i=p;i<n;i++) { if(!vis[i] && cur_sum+num[i]<=ave ) { vis[i]=1; if(cur_sum+num[i]==ave){if(heap+1<=4) dfs(0,0,heap+1);} else dfs(i+1,cur_sum+num[i],heap); vis[i]=0; } } } int main() { int T; scanf("%d",&T); while(T--) { ave=0; found=false; memset(vis,0,sizeof(vis)); scanf("%d",&n); for(int i=0;i<n;i++){scanf("%d",num+i); ave+=num[i];} //必须被4整除 if(ave%4)puts("no"); else { ave/=4; //按照从大到小排序 sort(num,num+n,greater<int>()); //必须所有的都小于平均数 if(num[0]>ave)puts("no"); else { dfs(0,0,0); if( found )puts("yes"); else puts("no"); } } } system("pause"); return 0; }