IDDFS--UESTC - 577 分数拆分
来源:互联网 发布:天网软件拖欠工资 编辑:程序博客网 时间:2024/06/07 08:13
Description
任何一个分数都能才成若干个单位分数(形如1/a的, a是自然数)的和。
对于一个分数
首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越好,如果还是相同,那么第二小的分数越大越好,依次类推下去。
例如对于
但是最好的是最后一种,因为
现在给出
Input
第一行有一个整数
Output
每组测试数据若干个数,自小到大排列,依次是单位分数的分母。
Sample Input
1
19 45
Sample Output
5 6 18
分析:本题采用迭代加深搜索算法,从小到大枚举深度上限maxd,每次执行只考虑深度不超过maxd的结点。深度上限还可以用来剪枝,按照分母递增的顺序来进行扩展,如果扩展到i层时,前i个分数之和为c/d,而第i个分数为1/e,则接下来至少还需要(a/b-c/d)/(1/e)个分数,总和才能达到a/b。
#include <cstdio>#include <cstring>#include <algorithm>using namespace std;typedef long long LL;const int maxn = 100 + 5;LL v[maxn], ans[maxn];int a, b, maxd;LL gcd(LL a, LL b){return b == 0 ? a : gcd(b, a%b);}//返回满足 1/c <= a/b 的最小 cinline int get_first(LL a, LL b){return b/a + 1;}//如果当前解v比目前最优解ans更优,更新ansbool better(int d){for(int i=d; i>=0; i--) if(v[i] != ans[i]) {return ans[i] == -1 || v[i] < ans[i];}return false;}//当前深度为d,分母不能小于from,分数之和恰好为 aa/bbbool dfs(int d, int from, LL aa, LL bb){if(d == maxd) {if(bb % aa) return false; //最后一层的解必须为埃及分数v[d] = bb/aa;if(better(d)) memcpy(ans, v, sizeof(LL)*(d+1));return true;}bool ok = false; from = max(from, get_first(aa, bb)); //枚举的起点 for(int i = from ; ; i++) {//剪枝:如果剩下的 maxd+1-d 个分数全是 1/i,加起来仍不超过 aa/bb,无解if(bb * (maxd+1-d) <= i * aa) break;v[d] = i;//计算 aa/bb - 1/i 的值,设结果为 a2/b2LL a2 = aa * i - bb;LL b2 = bb * i;LL g = gcd(a2, b2);if(dfs(d+1, i+1, a2/g, b2/g)) ok = true; } return ok;}int main(){int T;scanf("%d", &T);while(T--) {scanf("%d%d", &a, &b);int ok = 0;for(maxd=1; maxd<=100; maxd++) {memset(ans, -1, sizeof(ans));if(dfs(0, get_first(a, b), a, b)) { ok = 1; break; }}if(ok) {for(int i=0; i<=maxd; i++) printf("%d ", ans[i]);//printf("%d\n", ans[maxd]);printf("\n");} else printf("No solution.\n");} return 0;}
1 0
- IDDFS--UESTC - 577 分数拆分
- uestc oj 1668 分数拆分
- uva12558 埃及分数 IDDFS
- 埃及分数问题-IDDFS
- 分数拆分
- 分数拆分
- 分数拆分
- 分数拆分
- 分数拆分
- 分数拆分
- 分数拆分
- 分数拆分
- 分数拆分
- 分数拆分
- 分数拆分
- 分数拆分
- 分数拆分
- 分数拆分
- windows系统清理与维护
- Des 加密处理 iOS 和 安卓 与服务器 处理时 遇到的 补位问题
- C语言-文件操作的函数
- Android绘图机制(二) ViewGroup类
- spring事务控制【Spring】
- IDDFS--UESTC - 577 分数拆分
- Java序列化和反序列化
- 一张图教你看懂BAT三大巨头移动互联网布局
- SpringBeans【Spring】
- C#委托(一)
- 我的iOS一年半经验
- 人脸识别读书笔记
- Solving the problem when installing birl_baxter
- hdu4786Fibonacci Tree 最小生成树