给一些棍子,问能否围成一个正方形(必须全部用上)。
这么写的DFS就TLE了:
void dfs(int k,int id,int res) {
if (k==5) {
g = true;
return;
}
for (int i=id;i<=n;i++) {
if (!v[i] && res>=a[i]) {
v[i] = true;
if (res==a[i]) dfs(k+1,1,sum/4);
else dfs(k,i+1,res-a[i]);
v[i] = false;
}
}
} AC:
#include <iostream>
#include <algorithm>
using namespace std;
bool v[100],f,g;
int a[100],maxi,sum,n,cas;
bool cmp(int a,int b) {
if (a>b) return true;
else return false;
}
bool dfs(int k,int id,int res) {
if (k==5) return true;
for (int i=id;i<=n;i++) {
if (!v[i] && res>=a[i]) {
v[i] = true;
if (res==a[i]) {
if (dfs(k+1,1,sum/4)) return true;
}
else if (dfs(k,i+1,res-a[i])) return true;
v[i] = false;
}
}
return false;
}
int main() {
scanf("%d",&cas);
while (cas--) {
maxi = 0;
sum = 0;
scanf("%d",&n);
for (int i=1;i<=n;i++) {
scanf("%d",&a[i]);
if (a[i] > maxi) maxi = a[i];
sum += a[i];
}
f = true;g = false;
if (sum%4!=0 || maxi>sum/4) f = false;
else {
sort(a+1,a+n+1,cmp);
memset(v,0,sizeof(v));
g = dfs(1,1,sum/4);
}
if (f && g) printf("yes\n");
else printf("no\n");
}
return 0;
}
284

被折叠的 条评论
为什么被折叠?



