zoj - 1204 - Additive equations
来源:互联网 发布:淘宝网秋冬婴儿服装 编辑:程序博客网 时间:2024/06/02 19:42
先分层,然后进行深度优先遍历。
#include <iostream>#include <algorithm> using namespace std; const int maxn = 30 + 10; //每组数据最多有30个数int n, ok, C[maxn], a[maxn]; //n为每组数据的个数,ok标记是否有等式存在,C用来存路径,a为输入的数组 bool search(int *a, int x, int y, int v) //二分搜索,返回搜索成功与否{ int m; while(x < y) { m = x + (y-x)/2; if(a[m] == v) return 1; else if(a[m] > v) y = m; else x = m + 1; } return 0;}void dfs(int cur, int des, int cur_sum, int last) //深度优先遍历,cur为目前层数,des为目标层数,cur_sum为目前数的和,{ int i; if(cur == des) //当目前层数==目标层数的时候 { if(search(a, last, n, cur_sum)) //寻找数组中有没有这个和数存在(为节省时间,从last开始白手搜索) { for(i = 0; i < cur-1; i++) //输出 cout<<C[i]<<"+"; cout<<C[cur-1]<<"="<<cur_sum<<endl; ok = 1; //修改全局变量ok,说明有等式存在 } } else for(i = last; i < n; i++) //当目前层数!=目标层数的时候 { if(cur_sum + a[i] <= a[n-1] && C[cur-1] != a[i]) //第二个比较没有的话数字就可以重复出现了 { C[cur] = a[i]; //记录路径 dfs(cur+1, des, cur_sum + a[i], i); //递归调用 } }} int main(){ int N, i; cin>>N; //N组测试数据 while(N--) { cin>>n; for(i = 0; i < n; i++) cin>>a[i]; sort(a, a+n); //输完数据后先排序 int sum = 0; for(i = 0; i < n; i++) //找最多可以几个数相加,即最大层数 { sum += a[i]; if(sum >= a[n-1]) break; } int len = i+1; //最大层数 ok = 0; //注意这里标记为0 for(i = 2; i <= len; i++) //对每层进行搜索 dfs(0, i, 0, 0); if(!ok) cout<<"Can't find any equations."<<endl; cout<<endl; //小心,这里的最后一组也要加空行 } 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(深搜)
- 元旦英语祝福语-恭喜发财(十四)
- phper初学objective-c之读书笔记(一)
- zoj - 1788 - Quad Trees(四分树)
- zoj - 1076 - Gene Assembly
- zoj - 2734 - Exchange Cards
- zoj - 1204 - Additive equations
- zoj - 1091 - Knight Moves(直接查找法)
- winform 基于log4net的日志框架封装
- 构建树对象封装信息
- J2EE简介
- nyoj113
- SELinux总结
- nyoj221 已知条件构造二叉树
- 怎样使用vm安装fedora