33,007
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <list>
using namespace std;
//利用贪心求出arr中的一部分元素是否能组成正方形的一条边,
//若能,则删除这些元素,否则,can为false
void Side(list<int> &arr, int length, bool &can);
int main()
{
int count, n, all, length;
int temp, i;
bool can;
list<int> arr;
cin >> count;
while(count--)
{
can = true;
all = 0;
cin >> n;
for(i=0;i<n;i++)
{
cin >> temp;
arr.push_back(temp);
all += temp;
}
//则木棍的总长度不是4的倍数,一定不能拼成正方形
if(0 != all%4)
{
cout << "no" << endl;
arr.erase(arr.begin(), arr.end());
continue;
}
//将arr中的元素以降序排序
arr.sort(greater<int>());
length = all / 4;
//调用四次Side,则arr为空且can为true,则一定可以拼成正方形
for(i=0;i<4;i++)
{
if(!can)
break;
Side(arr, length, can);
}
if(!arr.empty())
can = false;
if(can)
cout << "yes" << endl;
else
cout << "no" << endl;
arr.erase(arr.begin(), arr.end());
}
return 0;
}
void Side(list<int> &arr, int length, bool &can)
{
can = false;
int sum = 0;
bool del;
list<int>::iterator iter = arr.begin();
list<int>::iterator temp;
while(iter != arr.end())
{
del = false;
temp = iter;
if(sum + (*iter) <= length)
{
sum += (*iter);
del = true;
}
iter++;
if(del)
arr.erase(temp);
if(sum == length)
{
can = true;
break;
}
}
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int end,B;
int save[20];
int pos[20];
int cmp(const void *a,const void*b)
{
return *(int *)a - *(int *)b;
}
int searhpos()
{
int i;
i=end;
while(!pos[i]) i--;
return i;
}
void DFS(int low,int hight,int n,int sum,int avg)
{
int i,j;
if(n<4&&B)
for(j=low;j<hight;j++)
{
if(B==0) break;
if(pos[j])
{
if(sum+save[j]==avg)
{
if(n<3)
{
pos[j]=0;
i=searhpos();
pos[i]=0;
DFS(0,i,n+1,save[i],avg);
pos[i]=1; pos[j]=1;
}
else { printf("yes\n"); B=0; break; }
}
else if(sum+save[j]<avg)
{
pos[j]=0;
DFS(j+1,hight,n,sum+save[j],avg);
pos[j]=1;
}
else if(sum==avg)
{
if(n<3)
{
i=searhpos();
pos[hight]=0;
DFS(0,i,n+1,save[i],avg);
pos[hight]=1;
}
else { printf("yes\n"); B=0; break; }
}
else break;
}
}
}
int main()
{
int N,M,i,j,avg;
scanf("%d",&N);
for(i=0;i<N;i++)
{
scanf("%d",&M);
avg=0;
for(j=0;j<M;j++)
{
scanf("%d",&save[j]);
avg=avg+save[j];
}
if(avg%4||save[M-1]>avg/4) { printf("no\n"); continue; }
else avg=avg/4;
memset(pos,1,80);
qsort(save,M,sizeof(int),cmp);
B=1;
end=M-1;
pos[M-1]=0;
DFS(0,M-1,0,save[M-1],avg);
if(B) printf("no\n");
}
return 0;
}