题目:http://acm.hdu.edu.cn/showproblem.php?pid=1518
题意:给你n根木棒,问用光所有的木棒能否拼成正方形。
dfs
剪枝:
1、当搜到三条边的时候,第四条边也就确定了。这时就找到解了,可以停止搜索了。
2、由于每一根木棒都要使用,所以在搜第一条边的时候可以直接拿第一根木棒作为这条边的头一根木棒。
3、搜索完毕后,若下一个搜索的数仍与当前相同,则寻找下一个不同的数进行搜索。
hdu 上 46MS 挤到第一版啦。 \(≧▽≦)/
#include <cstdio>
#include <cstring>
#include <functional>
#include <algorithm>
#define N 25
using namespace std;
int ave, n;
bool flag;
bool vis[N];
int a[N];
void dfs( int sum, int k, int cnt) {
if(flag) return;
if(cnt==3) {
flag = true;
return;
}
for(int i=k+1; i<=n; i++)
if(!vis[i]&&!flag&&sum+a[i]<=ave) {
vis[i] = 1;
if(sum+a[i]==ave) dfs(0,0,cnt+1);
else dfs(sum+a[i],i,cnt);
vis[i] = 0;
if(sum==0) break;
while(a[i]==a[i+1]) i++;
}
}
int main() {
int T, i, s;
scanf("%d",&T);
while(T--) {
s = 0;
memset(vis,0,sizeof(vis));
scanf("%d",&n);
for(i=1; i<=n; i++) {
scanf("%d",a+i);
s +=a[i];
}
sort(a+1,a+n+1,greater<int>());
flag = false;
if(s%4==0) {
ave = s/4;
dfs(0,0,0);
}
if(flag) printf("yes\n");
else printf("no\n");
}
return 0;
}