题目
- 链接
题目描述 Description
在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数。 如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的。 对于一个分数a/b,表示方法有很多种,但是哪种最好呢? 首先,加数少的比加数多的好,其次,加数个数相同的,最小的分数越大越 好。 如: 19/45=1/3 + 1/12 + 1/180 19/45=1/3 + 1/15 + 1/45 19/45=1/3 + 1/18 + 1/30, 19/45=1/4 + 1/6 + 1/180 19/45=1/5 + 1/6 + 1/18. 最好的是最后一种,因为1/18比1/180,1/45,1/30,1/180都大。 给出a,b( 0<a<b<1000 ),编程计算最好的表达方式。输入描述 Input Description
a b输出描述 Output Description
若干个数,自小到大排列,依次是单位分数的分母。样例输入 Sample Input
19 45样例输出 Sample Output
5 6 18
题解
- 这个搜索近几天是越来越烦人了!
- 此题一眼望去就是搜索,然而,题目中没给深度,所以用dfs乱搜是不行的。
- 没给深度,用bfs?
- 也不好,用bfs不敢剪枝。这个状态还要扩展几十次才能出解。什么,这就是最优方案?我怎么知道?
- 那用A*吧。
- 请问估价函数怎么写?请问这么大的空间开销怎么办?
- 正解:Dfs-ID,迭代加深搜索!一层一层地搜;用dfs的空间开销解决bfs的问题,并且方便了剪枝;有现成的系统栈能调用,还不用打堆;代码量小,易写易调试。
- 搜索后几层的时候前几层会重搜一遍,效率会降低。
不怕,前几层的代价相对于后一层来说又算得了什么呢?
以把原分数分解成的分数个数K为层数,从一开始的状态按照分母从小到大的顺序搜索。若在某一层搜到了解并且这一层已经搜完了,那这一层的最优解一定是整个问题的最优解。
- 假设现在要分解的分数是a/b;
- 若当前原分数已经分解成为超过K个分数,直接返回即可。
- 若a能整除b,那分解结束了,最后一个分母是b/a。用当前的解去更新答案,如果没有答案或当前解包含的分母个数少于答案或当前解包含的分母个数等于答案且当前解的最大分母比答案大,则当前解即为答案。
- 否则,要枚举i,使得 ab=a′b′