剪枝的 Accepted Square DFS P149 todo

//没有剪枝的  Time Limit Exceeded
/*
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 25;
int sticks[MAXN];
bool visit[MAXN];

//int side,int m 不变  或者写为全局变量
bool DFS(int sum,int number,int side,int m){ //side边长 m 数值数目
    if(number == 4) return true;
    for(int i=0;i<m;++i){
        if(visit[i] || sum+sticks[i] > side ) continue;

        visit[i] = true;
        if(sum + sticks[i] == side){
            if(DFS(0,number+1,side,m)){
                return true;
            }
        }else{
            if(DFS(sum+sticks[i],number,side,m)){
                return true;
            }
        }
        visit[i] = false;//todo  这一点从初试的时候就没搞明白
    }

    return false;
}

int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        int m;
        scanf("%d",&m);
        int length = 0;
        for(int i=0;i<m;++i){
            scanf("%d",&sticks[i]);
            length += sticks[i];
        }

        int side = length / 4; //若初不进呢?  里面BFS会有处理么
         memset(visit,false,sizeof(visit));
         if(DFS(0,0,side,m)){
             printf("yes\n");
         }else{
             printf("no\n");
         }

    }

    return 0;
}

*/
//剪枝的 Accepted  Square  DFS P149  todo
//http://poj.org/problem?id=2362
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 25;
int sticks[MAXN];
bool visit[MAXN];

//int side,int m 不变  或者写为全局变量
bool DFS(int sum,int number,int position,int side,int m){ //side边长 m 数值数目
    if(number == 3) return true;

    int sample = 0;
    for(int i=position;i<m;++i){
        if(visit[i] || sum+sticks[i] > side ||sticks[i] == sample) continue;

        visit[i] = true;
        if(sum + sticks[i] == side){
            if(DFS(0,number+1,0,side,m)){
                return true;
            }else{
                sample = sticks[i];
            }
        }else{
            if(DFS(sum+sticks[i],number,i+1,side,m)){
                return true;
            }else{
                sample = sticks[i];
            }
        }
        visit[i] = false;//todo  这一点从初试的时候就没搞明白
    }

    return false;
}
bool Compare(int x,int y){
    return x>y;
}

int main(){
    int n;
    scanf("%d",&n);
    while(n--){
        int m;
        scanf("%d",&m);
        int length = 0;
        for(int i=0;i<m;++i){
            scanf("%d",&sticks[i]);
            length += sticks[i];
        }
        if(length % 4!=0) {
            printf("no\n");
            continue;
        }
        int side = length / 4;
        memset(visit,false,sizeof(visit));
        sort(sticks,sticks+m,Compare);

        if(sticks[0]>side) {
            printf("no\n");
            continue;
        }

        if(DFS(0,0,0,side,m)){
            printf("yes\n");
        }else{
            printf("no\n");
        }

    }

    return 0;
}

全部评论

相关推荐

未知的命运:大佬这都找不到我还找啥啊
点赞 评论 收藏
分享
天降大厂offer:想从事前端就放前端的技术栈,然后项目描述,还有项目做了什么内容,使用了什么技术解决了什么问题优化了什么性能。然后头像可以不要,在读也可以不要,还有bg的话就不要放课程,写哪个学校什么本科,还有绩点排名(如果高的话),然后就是技术栈写好一点,接下来就是项目(有实习就写实习,没有就到项目),项目放两个好一点的,自己包装一下,然后有参加什么竞赛放两个就好了,接下来就是靠你自己了,毕竟211还是很难容易找的,不像我们学院本
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务