题解:UVA10364 Square
题目传送门
正解(搜索剪枝)
当总长度不是四的倍数时不可行。
接着将长度和除以 flag=1,(已有可行方案)则可以直接跳过以上操作。当木棍遍历结束,可直接判断 flag=1。最后输出。
代码展示
#include<bits/stdc++.h>
using namespace std;
int T,n,s;
int a[25],b[5];
int fl=0;
void dfs(int i){
if(i==n+1){
if(b[1]==b[2]&&b[2]==b[3]&&b[3]==b[4]) fl=1;
return;
}
for(int j=1;j<=4;j++){
if(b[j]+a[i]>s) continue;
if(fl==0){
b[j]+=a[i];
dfs(i+1);
b[j]-=a[i];
}
else break;
}
}
int main(){
cin>>T;
while(T--){
memset(b,0,sizeof(b));
fl=0;
s=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
s+=a[i];
}
if(s%4!=0){
cout<<"no"<<"\n";
continue;
}
s/=4;
dfs(1);
if(fl==1) cout<<"yes"<<"\n";
else cout<<"no"<<"\n";
}
return 0;
}