ZOJ 1204 Additive equations

来源:互联网 发布:服务资源智能调度算法 编辑:程序博客网 时间:2024/06/03 02:25

纠结了很久的一道搜索题目

提交了10次才通过。

一开始是TLE,然后就一直是WA了。

最后实在找不到原来的错误,就决定重敲,竟然异常地顺利,1A过了。

而且重敲的代码也比原来的代码简洁很多。

当局面已经乱得一塌糊涂的时候,不如快刀斩乱麻。推倒重建反倒是更优的策略。不过还是会有些纠结没有把原来的错误找出来。

先贴上重敲然后AC的代码

#include <iostream>#include <cstdio>#include <algorithm>#include <vector>using namespace std;#define MAXN 33int s[MAXN];int visit[MAXN];int ct;int n;bool is_out;//td目标因子数,cd现在因子数,pos现在位置,sum现在总和void dfs(int td,int cd,int pos,int sum){    if (td==cd){        for (int i=pos;i<n;i++){            if (sum==s[i]){                is_out=true;                printf("%d", visit[0]);                for (int j=1;j<ct;j++){                    printf("+%d", visit[j]);                }                printf("=%d\n", s[i]);                //很诡异的一个剪枝,我注释掉之后竟然还快乐10ms,估计是服务器问题                break;            }        }        return;    }    for (int i=pos;i<n+cd-td;i++){        //最关键的一个剪枝,从10001ms超时变成70ms        if (sum+s[i]>s[n-1]) return;        visit[ct++] = s[i];        dfs(td,cd+1,i+1,sum+s[i]);        ct--;    }    return;}int main(){    int t;    scanf("%d",&t);    while(t--){        scanf("%d",&n);        is_out=false;        ct = 0;        for (int i=0;i<n;i++){            scanf("%d",&s[i]);        }        sort(s,s+n);        //目的因子数        for (int i=2;i<n;i++){            dfs(i,0,0,0);        }        if (is_out==false)            printf("Can't find any equations.\n");        printf("\n");    }}

然后再贴一下一直WA的悲剧的代码快哭了


#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <algorithm>using namespace std;#define N 31struct basic{    int index;    int sum;    string result;    basic()    {        index = 0;        sum = 0;        result = "";    }    basic(const basic& rhs)    {        index = rhs.index;        sum = rhs.sum;        result = rhs.result;    }};struct node{    string prt;    int no;};bool cmp(const node &a, const node &b){    if (a.prt.length()<b.prt.length()) return true;    if (a.prt.length()==b.prt.length())        return a.no<b.no;    return false;}int s[N];int m;bool is_out;int cou ;node result[30000];void dfs(basic now){    if (now.sum>s[m-1]) return;    for (int i=now.index+1;i<m;i++)    {        if (now.sum+s[now.index]==s[i])        {            is_out = true;            char t[256];            string topu;            sprintf(t, "+%d=%d", s[now.index],s[i]);            topu = t;            result[cou].no = cou;            result[cou++].prt =now.result+topu;            break;        }        else            if (now.sum+s[now.index]<s[i]) break;    }    if (now.index >= m-1) return;    basic next(now);    next.index++;    next.sum += s[now.index];    char t[256];    string topu;    sprintf(t, "%d", s[now.index]);    topu = t;    if (now.sum!=0)        next.result += "+" +topu;    else        next.result = topu;    dfs(next);    next.result = now.result;    next.sum -=  s[now.index];    dfs(next);}int main(){    int n;    scanf("%d",&n);    while(n--)    {        scanf("%d",&m);        memset(s,0,sizeof(s));        cou = 0;        is_out = false;        for(int i=0;i<m;i++)        {            scanf("%d",&s[i]);        }        sort(s,s+m);        basic now ;        dfs(now);        sort(result,result+cou,cmp);        for ( int i=0;i<cou;i++)        {            printf("%s\n",(result[i].prt).c_str());        }//        printf("%d\n",cou);        if (!is_out) printf("Can't find any equations.\n");        printf("\n");    }    return 0;}


原创粉丝点击