#include
#include
#include
int ave, k;//ave是边长(即总和除4),k是统计输入m个棍子中长度不同的个数,避免重复搜索
struct stick
{
int len;
int num;
}a[20];
int cmp(const void* x, const void* y)
{
return (*(stick *)y).len - (*(stick *)x).len;
}
int dfs(int av, int s, int flag)//s是余下所有棍子的长度和
{
int i;
if(av == s)
{
return 1;//搜到最后一个棍子且正好是当前所需长度av
}
for(i = flag; i < k; i++)
{
if(a[i].num && a[i].len <= av)
{
a[i].num--;
if(a[i].len == av)
{
if(dfs(ave, s - a[i].len, 0))
{
return 1;
}
}
else
{
if(dfs(av - a[i].len, s - a[i].len, i))
{
return 1;//要记录下标i,因为a[i]中长度len是按降序排列,
} //av - a[i].len肯定小于当前所需长度av,所以下次找时只需在i后面找就行了
}
a[i].num++;
}
}
return 0;
}
int main(void)
{
int i, j, m, n, sum, length, maxlen;
scanf("%d", &n);
while(n--)
{
sum = k = maxlen = 0;
memset(a, 0, sizeof(a));
scanf("%d", &m);
for(i = 0; i < m; i++)
{
scanf("%d", &length);
maxlen = maxlen > length ? maxlen : length;
sum += length;
for(j = 0; j < k; j++)
{
if(length == a[j].len)
{
a[j].num++;
break;
}
}
if(j == k)
{
a[j].len = length;
a[j].num = 1;
k++;
}
}
ave = sum / 4;
if(sum % 4 || maxlen > ave)
{
printf("no\n");//总和不能被4整除或最长棍子大于边长,直接剪掉
}
else
{
qsort(a, k, sizeof(a[0]), cmp);//按棍子长度降序排列
if(dfs(ave, sum, 0))
{
printf("yes\n");
}
else
{
printf("no\n");
}
}
}
//system("pause");
}
zoj1909 Square
最新推荐文章于 2020-04-12 21:38:48 发布