• 理论上可以用回溯法求解,但是解答树非常恐怖,其一深度没有明显上限,1/i的值似乎可以在枚举不断更大的i时越来越小;其二加数的选择在理论上无限制。
  • 解决方案采用迭代加深搜索:从小到大枚举深度上限maxd,每次只执行深度不超过maxd的结点。这样,if(bb*(maxd+1-d)<=i*aa) break;在i++到一定值后一定会退出循环,不会在已经得到解的情况下继续往下递归
  • 埃及分数这道题题意说加数少的比加数多的好,所以在主程序当前maxd下,得到了解ok=1,则不管接下来的maxd,程序结束
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cassert>
using namespace std;
int a, b, maxd;
typedef long long LL;
LL gcd(LL a, LL b)  //辗转相除法,求最大公因子
{return b == 0 ? a : gcd(b, a%b);
}
// 返回满足1/c <= a/b的最小c
inline int get_first(LL a, LL b)
{return b/a+1;
}
const int maxn = 100 + 5;
LL v[maxn], ans[maxn];
// 如果当前解v比目前最优解ans更优,更新ans这一判断的依据
bool better(int d)  //前d个,这时d只能是maxd,
{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/bb
bool dfs(int d, int from, LL aa, LL bb)
{if(d == maxd){if(bb % aa) return false; // aa/bb必须是埃及分数(任何数mod1都等于0,可以起到一部分剪枝的作用)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;//从第0层开始算的,总共有maxn+1个v[d] = i;// 计算aa/bb - 1/i,设结果为a2/b2LL b2 = bb*i;LL a2 = aa*i - bb;LL g = gcd(a2, b2); // 以便约分if(dfs(d+1, get_first(a2/g, b2/g), a2/g, b2/g)) ok = true;}return ok;//注意这些返回条件
}int main()
{int kase = 0;while(cin >> 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;}}cout << "Case " << ++kase << ": ";if(ok){cout << a << "/" << b << "=";for(int i = 0; i < maxd; i++) cout << "1/" << ans[i] << "+";cout << "1/" << ans[maxd] << "\n";}else cout << "No solution.\n";}return 0;
}

  

转载于:https://www.cnblogs.com/mdz-great-world/p/6378386.html

埃及分数问题+迭代加深搜索相关推荐

  1. 埃及分数问题——迭代加深搜索

    问题描述:在古埃及,人们使用单位分数的和(即1/a,a是自然数)表示一切有理数.例如,2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中不允许有相同的,则最小的分数越大越好.例如19/ ...

  2. 埃及分数 (迭代加深入门)

    Description: 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数.如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的.对于一个分数a/b ...

  3. 迭代加深搜索与埃及分数求解

    迭代加深搜索,实质上是限定下界的深度优先搜索.即首先允许深度优先搜索K层,若没有发现可行解,再将K+1后 重复以上步骤搜索,直到搜索到可行解. 在迭代加深搜索的算法中,连续的深度优先搜索被引入,每一个 ...

  4. 启发式搜索 迭代加深搜索 搜索对象的压缩存储

    常见的几种搜索算法 常见的几种搜索算法_唐宋缘明卿_cris的博客-CSDN博客_搜索算法有哪些 搜索 -- 启发式搜索 搜索 -- 启发式搜索_Alex_McAvoy的博客-CSDN博客_启发式搜索 ...

  5. 搜索进阶之迭代加深搜索

    迭代加深搜索 首先这个不要怕这个东西,其实我刚开始学这个搜索也觉得特别高大上,觉得都是很高大上让人听不懂的专业术语,其实说白了迭代加深搜索的思想和精髓就是控制了搜索深度的dfs,但是却能够达到广搜的效 ...

  6. 搜索专题小结:迭代加深搜索

    迭代加深搜索 迭代加深搜索(Iterative Deepening Depth-First Search, IDDFS)经常用于理论上解答树深度上没有上界的问题,这类问题通常要求出满足某些条件时的解即 ...

  7. hdu 1560 DNA sequence(迭代加深搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1560 题意:从n个串中找出一个最短的公共串,,该公共串对于n个字符串不要求连续,即只要保持相对顺序就好 ...

  8. 紫书搜索 习题7-8 UVA - 12107 Digit Puzzle IDA*迭代加深搜索

    题目链接: https://vjudge.net/problem/UVA-12107 题意: 给出一个数字谜,要求修改尽量少的数,使修改后的数字谜只有唯一解.空格和数字可以随意替换,但不能增删,数字谜 ...

  9. UVA - 11214Guarding the Chessboard守卫棋盘(迭代加深搜索)

    题意:输入一个n*m棋盘(0<n,m<10),某些格子有标记.用最少的皇后守卫所有带标记的格子.皇后规则是所在坐标的直线和斜线都可以被守卫,长度不限. 分析:因为不知道深度,所以用迭代加深 ...

最新文章

  1. 在元宇宙里怎么交朋友?Meta发布跨语种交流语音模型,支持128种语言无障碍对话...
  2. Local Response Normalization作用——对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力...
  3. 【Python】Jupyter notebook
  4. git分支操作的成功案例
  5. 【译】Introduction to Byteball — Part 2: The DAG
  6. 用js实现统计字符串里面的出现次数最多的字符
  7. 各种锁的介绍、锁之间的区别
  8. GUI库:PyQt5
  9. 4-1,4-2机器学习和神经网络的基本概念
  10. 英特尔 AI 芯片业务的现状与未来
  11. [Guava源码日报(1)]Guava类库简介
  12. python有趣的代码-python菜鸟教程,python好玩又简单的代码
  13. VS2010安装MVC4记录
  14. 计算机网络技术教研活动,(2012.09.27)计算机网络技术专业教研活动(文本).doc...
  15. 仿淘宝、腾讯课堂评分组件 --- Android高级自定义组件
  16. JS - Promise使用详解--摘抄笔记
  17. 微信开发如何屏蔽投诉按钮(附代码)
  18. 语雀 添加块级模式公式
  19. linux系统php安装sockets扩展
  20. 【Android】Webview加载url出现空白但是在手机或者pc的浏览器中可以正常打开的解决方法

热门文章

  1. java 得到bean的属性_获取javaBean所有属性及类型.doc
  2. python私有成员与公有成员_Python访问限制私有还是公有的介绍(附示例)
  3. MapReduce框架下的FP Growth算法概述
  4. python语言输入中文_selenium+python 语言编写问题,在执行时无法输入中文用户名...
  5. 新增一个主键自增长_第17期:索引设计(主键设计)
  6. python广度优先算法最短路径_最短路径问题的Dijkstra算法 -python
  7. 目标检测(二)--Hough Forests for Object Detection
  8. 清除图片下默认的小间隙_PowerMILL软件应用策略(一):模型区域清除策略
  9. opencv 识别长方形_利用opencv识别并提取图片中的矩形
  10. 图的表示:如何存储微博、微信等社交网络中的好友关系