OK,我也不是搞ACM的,首先对文章标题来一波直白解析:
迭代加深搜索: 从小到大枚举上线maxd,每次进出深度遍历时只考虑深度不超过maxd的结点。
启发式搜索: 一般是指在普通的搜索方法情况下,构建一个启发函数,得到启发值,然后通过启发值可以进行:
1、剪枝效果,
2、根据启发值来给安排搜索先后
OK,我们来看两个题目,试试好吧。
-
1、埃及分数:
在古埃及,人们使用单位分数的和(即1/a,a是自然数)来表示一切有理数,例如,2/3=1/2+1/6,但是不允许2/3=1/3+1/3,因为在加数中不允许有相同的。对于一个分数a/b,表示的方法有很多种,其中加数少的比加数多的好,如果加数个数相同,那么最小的分数越大越好。例如,19/45=1/5+1/6+1/18是最优方案。
输入两个整数a,b(0<a<b<500),试编程计算最佳表达式。
样例输入:
495 499
样例输出:
Case 1: 495/499=1/2+1/5+1/6+1/8+1/3992+1/14970
对于这种要求最优方案的情况下,BFS是一种比较常见的措施,但是只要你思考一波,你会发现连一遍都无法遍历完,因为n是可以认为没有上限,所以此时,我们采用迭代加深搜索+启发式搜索会有一个不错的东西:
迭代加深搜索:1、maxd深度从1往后遍历,直到找到
启发式搜索:2、剪枝策略:如果当前不可能在maxd深度内完成,便直接推出
OK,我们来上代码:
public class EgyptianFraction {
private int dep = 1;
private long[] d = new long[11];
private long[] ans =new long[11];
private boolean flag = false;
public void