uva10400 - Game Show Math(回溯+剪枝)
2016-03-05 12:31
393 查看
题意:
给你一组数据及数target,让你按序用这组数据及加减乘除使得结果为target,有则输出序列,无则输出“NO EXPRESSION”
Sample Input
3
3 5 7 4 3
2 1 1 2000
5 12 2 5 1 2 4
Sample Output
5+7/4=3
NO EXPRESSION
12-2/5*1*2=4
思路:
直接回溯,TLE了,马上想到剪枝,这题的话可以看每步所得的sum是否已经计算过了,但各种WA,看到别人的代码才发现原因,用vis[cur][sum]判断是否访问是不对的,因为sum可能是负数,所以应当sum+50000(题目数据量为32000,大于32000都可)来保证它>0
代码如下:
给你一组数据及数target,让你按序用这组数据及加减乘除使得结果为target,有则输出序列,无则输出“NO EXPRESSION”
Sample Input
3
3 5 7 4 3
2 1 1 2000
5 12 2 5 1 2 4
Sample Output
5+7/4=3
NO EXPRESSION
12-2/5*1*2=4
思路:
直接回溯,TLE了,马上想到剪枝,这题的话可以看每步所得的sum是否已经计算过了,但各种WA,看到别人的代码才发现原因,用vis[cur][sum]判断是否访问是不对的,因为sum可能是负数,所以应当sum+50000(题目数据量为32000,大于32000都可)来保证它>0
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 105; int arr , p; int ok; char op ; int target; int vis [90000]; int Judge(int cur, int sum) { if (sum >= -32000 && sum <= 32000 && !vis[cur][sum+50000]) { vis[cur][sum+50000] = 1;//sum可能是负数,所以要加50000 return true; } return false; } void dfs(int sum,int i) { if (i == p) { if (sum == target){ ok = true; for (int j = 0; j < p; j++) { if (j != p - 1) printf("%d%c", arr[j], op[j + 1]); else printf("%d=%d", arr[j], target); } printf("\n"); } return; } for (int j = 0; j < 4; j++) { if (ok) return; int cur = sum; if (j == 0) { cur += arr[i]; op[i] = '+'; if (Judge(i, cur)) dfs(cur, i + 1); } if (j == 1) { cur -= arr[i]; op[i] = '-'; if (Judge(i, cur)) dfs(cur, i + 1); } if (j == 2){ cur *= arr[i]; op[i] = '*'; if (Judge(i, cur)) dfs(cur, i + 1); } if (j == 3){ if (cur%arr[i] != 0) continue; cur /= arr[i]; op[i] = '/'; if (Judge(i, cur)) dfs(cur, i + 1); } } } int main() { int cas; scanf("%d", &cas); while (cas--) { memset(vis, 0, sizeof(vis)); memset(op, 0, sizeof(op)); scanf("%d", &p); for (int i = 0; i < p; i++) scanf("%d", &arr[i]); scanf("%d", &target); ok = false; dfs(arr[0], 1); if (!ok) printf("NO EXPRESSION\n"); } return 0; }
相关文章推荐
- 2016年新学期算法课安排
- py延迟注入SQL脚本
- 【HDOJ】4579 Random Walk
- jdk API标记接口
- 《统计学习方法》——感知机与支持向量机
- 在EA中的UML图中插入设计模式的模板
- HDU 3294 Girls' research
- xml基础
- mysql的root设置密码
- pat1002:写出这个数
- 2015 浙江省赛 Team Formation (思维题)
- 栈回溯技术arm_v5t_le版
- 海盗分金币
- java中文件和流处理
- 继承和构造器相关知识的个人理解
- JAVA数据类型讲解
- 第一天 加入
- 一个师兄的面试经验,很诚恳
- 联想 ideapad 300s 拆机换内存手记
- 第二次作业2