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;}
- ZOJ 1204 Additive equations
- ZOJ 1204Additive equations
- zoj - 1204 - Additive equations
- ZOJ 1204 Additive equations
- ZOJ 1204 Additive equations
- ZOJ 1204 Additive equations
- zoj 1204 Additive equations
- zoj 1204 Additive equations
- zoj 1204 Additive equations
- ZOJ 1204Additive equations
- ZOJ 1204 Additive equations
- ZOJ 1204 Additive equations
- ZOJ 1204 Additive equations
- ZOJ 1204(Additive equations)
- ZOJ - 1204 Additive equations(搜索)
- ZOJ 1204 Additive equations (回溯)
- ZOJ-1204 Additive equations (DFS)
- ZOJ 1204 Additive equations(深搜)
- 黑马程序员 Java异常
- C++图像处理 -- 表面模糊
- 批处理编译vc工程
- linux中tree命令
- AfxMessageBox(_T("ERROR"));
- ZOJ 1204 Additive equations
- 关于CS遇到的浮动的问题:注意DIV的顺序和浮动原理!
- [Borland.Delphi.V1.V2.V.3.古董.怀旧.供爱好者收藏用].Borland.Delphi1.rar
- “ssh localhost”去掉输入密码(CentOS 6.3)
- Manifold Preserving Edit Propagation
- unity3d工作笔记(1)
- 函數副作用-纯函数
- 做一个网站的步骤
- 关于where(泛型类型约束)