Visitors hit counter dreamweaver

poj 2362

    这题的目的是要学会剪枝。

    说是用DFS,但是我不知道要怎么样DFS。。。郁闷了。还是看了别人的才恍然大悟。明天再好好看看!

 

#include <iostream>
#include <fstream>
#include <cstdio>
#include <memory.h>
#include <algorithm>

#define MAX 20
using namespace std;

int n,m,sum,side,flag;
int a[MAX],used[MAX];

void dfs(int len,int side_num,int start) //
{
int tem_len;
if(side_num==3) flag=1;
if(flag) return;
for(int i=start; i<m; i++)
{
if(used[i]==0)
{
tem_len=len+a[i];
if(tem_len<side)
{
used[i]=1;
dfs(tem_len,side_num,i);
used[i]=0;
}
else if(tem_len>side)
{
return;
}
else //add side_numbers
{
used[i]=1;
dfs(0,side_num+1,0);
used[i]=0;
}
}
}//for
}

int main()
{
freopen("acm.txt","r",stdin);
scanf("%d",&n);
for(int i=0; i<n; i++)
{
sum=0;
memset(a,0,sizeof(a));
memset(used,0,sizeof(used));
scanf("%d",&m);
for(int j=0; j<m; j++)
{
scanf("%d",&a[j]);
sum+=a[j];
}
sort(a,a+m);
side=sum/4;
if(sum%4!=0 || side<a[m-1] )
{
printf("no\n");
}
else{
flag=0;
dfs(0,0,0);
if(flag)
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
}//for
return 0;
}

 

posted @ 2012-03-20 00:23  Jason Damon  阅读(167)  评论(0编辑  收藏  举报