[数据结构]埃及分数(暴力,解答树,迭代加深搜索)
2015-06-20 23:42
573 查看
/* Name:埃及分数(迭代加深搜索) Actor:HT Time:2015年6月20日 Error Reporte: 1.分数比较大小方法 } */ #include"stdio.h" #include"iostream" #include"string.h" using namespace std; int dep; int flag = 0; //成功的旗子 int ans[10]; //答案的每一个分母 int rans[10]; //真·答案的每一个分母 int PK(int a, int b, int c, int d) //分数比较大小 { if (a*d == b*c) return 0; if (a*d > b*c) return 1; //前者大 if (a*d < b*c) return -1; //后者大 } void dfs(int a, int b, int k, int set) //四个参数,前两个原分数,k是当前层数,set是当前最大的分母,由于无法重复,后面的只能比他更大 { if (k == dep + 1) return; //出界 int i; for (i = set;; i++) //每一层的搜索,继承与set的值 { if (PK(a, b, (dep + 1 - k), i) == 1) break; if (PK(a, b, 1, i) == -1) continue; ans[k] = i; if (PK(a, b, 1, i) == 0) { memcpy(rans, ans, sizeof(ans)); flag = 1; break; } dfs(a*i - b, b*i, k+1, i+1); //原分数减去新分数的计算公式 } return; } void Work(int a, int b) { for (dep = 1; dep <= 10; dep++) //迭代深搜 { dfs(a, b, 1 ,2); if (flag) //简单的输出控制 { printf("1/%d", rans[1]); for (int i = 2; i <= dep; i++) printf("+1/%d", rans[i]); cout << endl; break; } } } int main() { int a, b; while (cin >> a >> b) { cout << a << "/" << b << "="; Work(a, b); } return 0; } /* 不咋懂eg: #include"stdio.h" #include"iostream" #include"string.h" using namespace std; typedef long long LL; const int INF = ~0U >> 1; const int N = 10; int dep, flag; int ans , d ; int gcd(int a, int b) { return b ? gcd(b, a%b) : a; }//求最大公约 void dfs(int a, int b, int k) { if (k == dep + 1) return; if (b % a == 0 && b / a > d[k - 1]) { d[k] = b / a; if (!flag || d[k] < ans[k]) memcpy(ans, d, sizeof(d)); flag = 1; return; } int s = b / a; if (s <= d[k - 1]) s = d[k - 1] + 1; int t = (dep - k + 1) * b / a; if (t > INF / b) t = INF / b; if (flag && t >= ans[dep]) t = ans[dep] - 1; for (int i = s; i <= t; i++) { d[k] = i; int m = gcd(i*a - b, b*i); dfs((i*a - b) / m, b*i / m, k + 1); } } void Work(int a, int b) { d[0] = 1; flag = 0; for (dep = 1; dep <= N; dep++) { dfs(a, b, 1); if (flag) { printf("1/%d", ans[1]); for (int i = 2; i <= dep; i++) printf("+1/%d", ans[i]); cout << endl; break; } } } int main() { int a, b; while (cin >> a >> b) { cout << a << "/" << b << "="; Work(a, b); } return 0; }*/
相关文章推荐
- [数据结构]二叉树自学
- 线性表子系统
- 数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算
- 数据结构——链式队列(c++)
- 斐波那契查找(超详解)
- 数据结构——循环队列(c++)
- 数据结构——链式栈(c++)
- 第2章 算法入门
- To_review_100_1---KMP算法的整理
- 数据结构——顺序栈(c++)
- Esper入门简介:三、 对Esper底层数据结构特点分析,数据的入、出
- Redis内部数据结构详解之压缩链表(ziplist)
- 算法竞赛入门经典之stl重的常用数据结构----->set
- [数据结构]栈之顺序栈的类模板实现
- Codeforces Round #285 (Div. 1)B. Misha and Permutations Summation(数学+数据结构打脸)
- leetcode--Binary Search Tree Iterator
- 【PAT】自测3 数组元素循环右移
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:汉诺塔问题 Hanoi