EOJ 1154:Can you do DFS? (IDA*)
来源:互联网 发布:淘宝gucci天猫旗舰店 编辑:程序博客网 时间:2024/06/05 09:21
题目链接:http://www.acm.cs.ecnu.edu.cn/problem.php?problemid=1154
题意:埃及分数。给你一个真分数,要求拆成若干个单位分数的和,有以下一个要选,一是分数和的个数越少越好,二是如果分数和的个数一样的话要求最小的分数越大越好,三是如果前两个要求都一样的话要求输出字典序最小的。
分析:由于拆分的个数不明确,因此可以采用迭代加深搜索,从1开始一直往上搜,直到找到解。在搜索过程中可以加入剪枝,如当前深度下,如果后面都选取最优仍无法在当前限制深度下搜到解的话就停止搜索这颗子树。
代码:
#include <iostream>#include <algorithm>#include <fstream>#include <cstring>#include <vector>#include <queue>#include <cmath>#include <cctype>#include <stack>#include <set>using namespace std;const int maxn = 10000 + 5;int l;long long a, b;long long v[maxn], ans[maxn];long long get_first(long long x, long long y){ if (y % x) return y / x + 1; return y / x;}long long gcd(long long x, long long y){ return (y == 0) ? x : gcd(y, x % y);}bool better(int d){ return (ans[d] == -1 || v[d] < ans[d]);}bool DFS(int d, long long from, long long aa, long long bb, int limit){ if (d == limit) { if (bb % aa) return false; v[d] = bb / aa; if (better(d)) memcpy(ans, v, sizeof(long long) * (d + 1)); return true; } bool ok = false; from = max(from, get_first(aa, bb)); for (int i = from; ; ++i) { if (bb * (limit + 1 - d) <= i * aa) break; v[d] = i; long long b2 = bb * i; long long a2 = aa * i - bb; long long g = gcd(a2, b2); if (DFS(d + 1, i + 1, a2 / g, b2 / g, limit)) ok = true; } return ok;}int main(){ while (~scanf("%lld%lld", &a, &b)) { for (int i = 1; ; ++i) { memset(ans, -1, sizeof(ans)); if (DFS(1, get_first(a, b), a, b, i)) { l = i; break; } } for (int i = 1; i <= l; ++i) if (i < l) printf("%lld ", ans[i]); else printf("%lld\n", ans[i]); } return 0;}
0 0
- EOJ 1154:Can you do DFS? (IDA*)
- EOJ1154 CAN YOU DFS? IDA*搜索算法
- can you do it
- UVa 10946 Do You What Filled? (DFS)
- EOJ 2832:ZERO(DFS)
- How Many Equations Can You Find 2266 (深搜 dfs)
- 【HDU】2266 - How Many Equations Can You Find(dfs)
- HDU 2266 How Many Equations Can You Find (DFS)
- DFS hdu2266(How Many Equations Can You Find)
- 这就是命-How can you do?
- 【郑轻】[1761]You can do it
- EOJ 1981:Sticks(DFS+剪枝)
- EOJ 3297 铺瓷砖(DFS)
- How Many Equations Can You Find(DFS)
- Unicode: What You Can Do About It Today
- 重施C语言,YOU CAN DO THIS,guy!
- What things you can do in Windows Azure? (Public Cloud)
- What can you do using Windows Azure IP?
- 秀出你的开源项目,拿奖金,赢捐助
- C#实现远程开机(局域网测试通过)
- PAT 1027 打印沙漏-------思路很重要
- bootstrap2使用时兼容问题的解决
- 项目A
- EOJ 1154:Can you do DFS? (IDA*)
- Masonry介绍与使用实践:快速上手Autolayout
- HDU 2242(概率dp 分情况统计)
- xml特殊字符转义技术
- The User Acceptance Problem
- Objective-C学习笔记
- Hadoop 实例11 二次排序讲解
- SOAPUI测试WSDL项目(二)---操作和请求
- The Importance of Consommé