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;
}