[数据结构]埃及分数(暴力,解答树,迭代加深搜索)

来源:互联网 发布:6数字域名 编辑:程序博客网 时间:2024/06/06 03:21
/*Name:埃及分数(迭代加深搜索)Actor:HTTime: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[N], d[N];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;}*/

0 0
原创粉丝点击