您的位置:首页 > 其它

【HDOJ】1518 Square

2014-06-05 16:12 148 查看
DFS+剪枝。与HDOJ 1455如出一辙。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAXN 25

int nums[MAXN], n, len, cnt;
char visit[MAXN];

int comp(const void *a, const void *b) {
return *(int *)b - *(int *)a;
}

int dfs(int cnt, int beg, int l) {
int i, flg = 0;
if (cnt == 3)
return 1;
if (l == 0) {
for (i=0; i<n; ++i) {
if ( !visit[i] ) {
visit[i] = 1;
flg = dfs(cnt+1, i+1, len-nums[i]);
visit[i] = 0;
break;
}
}
return flg;
}

for (i=beg; i<n; ++i) {
if ( !visit[i] ) {
if (i && !visit[i-1] && nums[i] == nums[i-1])
continue;
if (nums[i] <= l) {
visit[i] = 1;
flg = dfs(cnt, i+1, l-nums[i]);
visit[i] = 0;
if (flg) return 1;
}
}
}

return 0;
}

int main() {
int case_n, sum;
int i, j;

scanf("%d", &case_n);

while (case_n--) {
scanf("%d", &n);
sum = 0;
for (i=0; i<n; ++i) {
scanf("%d", &nums[i]);
sum += nums[i];
}
if ( sum&3 )
printf("no\n");
else {
len = sum>>2;
qsort(nums, n, sizeof(int), comp);
memset(visit, 0, sizeof(visit));
j = 1;
for (i=0; i<n; ++i)
if (nums[i] > len) {
j = 0;
break;
}
if (!j)
printf("no\n");
else if ( dfs(0, 0, len) )
printf("yes\n");
else
printf("no\n");
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: