poj2362 dfs

来源:互联网 发布:qq等级加速器软件 编辑:程序博客网 时间:2024/05/22 16:03

给一些棍子,问能否围成一个正方形(必须全部用上)。

这么写的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;}