前言:

学习算法时,一个关键的问题是什么时候来使用它。在一些搜索问题中,使用普通的DFS可能会让你把时间浪费在深度非常大而且答案不是最优的搜索过程上,甚至有的时候DFS搜索的深度是无穷的,而BFS虽说理论上可以避免这种情况,却又无法满足题目的某些需求,或者无法实现。仔细思考一下这个例子,它有着两个特征:一是它是个最优解问题,二是最优的答案深度最小,如右图:

但是我们的答案有三个,若我们要ans3这个答案,那么DFS和BFS都是不满足的,so我们引入迭代加深搜索来解决这个问题。

概念:

1.迭代加深搜索,实质上就是限定下界的深度优先搜索。即首先允许深度优先搜索K层搜索树,若没有发现可行解,再将K+1后重复以上步骤搜索,直到搜索到可行解。

2.在迭代加深搜索的算法中,连续的深度优先搜索被引入,每一个深度约束逐次加1,直到搜索到目标为止。

3.迭代加深搜索算法就是仿广度优先搜索的深度优先搜索。既能满足深度优先搜索的线性存储要求,又能保证发现一个最小深度的目标结点。

4.从实际应用来看,迭代加深搜索的效果比较好,并不比广度优先搜索慢很多,但是空间复杂度却与深度优先搜索相同,比广度优先搜索小很多,在一些层次遍历的题目中,迭代加深不失为一种好方法!

那么我们就开始例题吧。

题目描述:

An addition chain for n is an integer sequence <a0, a1,a2,...,am> with the following four properties:

  • a0 = 1
  • am = n
  • a0 < a1 < a2 < ... < am-1 < am
  • For each k (1 <= k <= m) there exist two (not necessarily different) integers i and j (0 <= i, j <= k-1) with ak = ai + aj

You are given an integer n. Your job is to construct an addition chain for n with minimal length. If there is more than one such sequence, any one is acceptable.

For example, <1, 2, 3, 5> and <1, 2, 4, 5> are both valid solutions when you are asked for an addition chain for 5.

输入;

The input will contain one or more test cases. Each test case consists of one line containing one integer n (1 <= n <= 100). Input is terminated by a value of zero (0) for n.

输出;

For each test case, print one line containing the required integer sequence. Separate the numbers by one blank.

输入样例:

5
7
12
15
77
0

输出样例:

1 2 4 5
1 2 4 6 7
1 2 4 8 12
1 2 4 5 10 15
1 2 4 8 9 17 34 68 77

总之就是:

已知一个数列a0,a1,……,am(其中a0=1,am=n,a0<a1<……<am-1<am)。

对于每个k,需要满足ak=ai+aj(0 ≤ i,j ≤ k-1,这里i与j可以相等)。

现给定n的值,要求m的最小值(并不要求输出)。

及这个数列每一项的值(可能存在多个数列,只输出任一个满足条件的就可以了)(但其实不然)。

思路分析:

此是来自GM的题解:

首先可以求出最少需要几个元素可以达到n。按照贪心的策略,对于每个元素的值,都选择让它等于一个数的两倍,即对于每个Ai = Ai-1 + Ai-1,  当Ai>=n时就跳出循环,得到最少元素个数。然后从最少步数开始迭代加深搜索。 最后再用上一些减枝技巧即可。

而现在是主要讲IDDFS。

首先,当长度与规定深度相同时,我们就要判断数列末项是否相同,如果相同就是答案。

然后从数列的前项里求最好的方法。(这里一定要从后往前找,不然过不了)。

然后还有一个期望函数,若果用最大的数都无法得到答案,那么就返回。

代码实现:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans[105];
bool f;
void dfs(int x,int de)
{if(f)return;if(x==de){if(ans[x]==n)f=1;return;}for(int i=x;i>=0;i--){for(int j=i;j<=x;j++)if(ans[i]+ans[j]>ans[x]&&ans[i]+ans[j]<=n){int sum=ans[i]+ans[j];for(int k=x+2;k<=de;k++)sum*=2;if(sum<n)continue;ans[x+1]=ans[i]+ans[j];dfs(x+1,de);if(f)return;}}
}
int main()
{while(scanf("%d",&n)!=-1){if(n==0)return 0;memset(ans,0,sizeof(ans));f=0;ans[0]=1;int m=1,depth=0;while(m<n){m*=2;depth++;}while(1){dfs(0,depth);if(f)break;depth++;}printf("%d",ans[0]);for(int i=1;i<=depth;i++)printf(" %d",ans[i]);printf("\n");}
}

C++迭代加深搜索及其例题讲解—————Addition Chains相关推荐

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

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

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

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

  3. NUIST OJ 1347 供电站 [迭代加深搜索]

    题目 题目分析 本题的坑 整体代码与运行结果 题目 题目描述 你一个程序员,不知为何就当上了你们镇的镇长(人的一生当然要靠自我奋斗,当然也要考虑历史的进程).你们镇有 N (3 <= N < ...

  4. hdu1667-IDA*-迭代加深搜索 A*算法

    迭代加深搜索 迭代加深搜索,实质上是限定下界的深度优先搜索.即首先允许深度优先搜索K层,若没有发现可行解,再将K+1后重复以上步骤搜索(即深度优先搜索k+1层),直到搜索到可行解. 在迭代加深搜索的算 ...

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

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

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

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

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

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

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

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

  9. P2324 [SCOI2005]骑士精神(迭代加深搜索,dfs)

    传送门 文章目录 解析 解析 很显然,让马走的话状态记录和转移都会比较复杂 所以转化成让空位跳会更好做一点 但这不是重点 初看本题,其实第一感觉是bfs 但是状态数理论上最差可以达到815,(当然基本 ...

最新文章

  1. OpenGL ES 详解纹理生成和纹理映射步骤以及函数
  2. 运行txt文本也可能中毒!微软急修“文本病毒”漏洞
  3. js检测鼠标是否在操作_原生JS趣味demo:炫酷头像鼠标追随效果的实现
  4. 负载均衡很难?看完这篇全懂了
  5. ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?
  6. LeetCode 217. 存在重复元素(哈希)
  7. 引入静态变量_Common Lisp变量的一些事情
  8. 三月数据库技术通讯.pdf | Oracle配置DCD避免会话被防火墙强制断开
  9. 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family
  10. linux readelf,readelf命令常用参数介绍
  11. 自动驾驶算法详解(6):Astar算法原理以及路径规划应用在python与ros平台实现
  12. win10开机出现任务栏卡死无反应,桌面点击正常,重启任务管理器无效
  13. 建议平面设计爱好者要学的软件,和一些CDR常见问题
  14. AI作曲的诺亚方舟将去往何处
  15. Java Pair的使用
  16. 洪金宝坦言婚姻全靠“忍”。网友:好男人啊
  17. Maven项目Dependencies常见报错及解决方案
  18. 实战项目(2)STM32cubeMX配置蓝牙模块
  19. PY-Batt7,8任意文件上传漏洞
  20. 打印系统开发(39)——检查打印机状态

热门文章

  1. python长度转换
  2. 方便你我他,百科全书:)
  3. 聚偏氟乙烯(PVDF)/1-乙烯基-3-丁基咪唑氯盐离子液体([VBIM][Cl])复合材料(PVDF/[VBIM][Cl])特性
  4. Android 传感器之《加速传感器》——摇一摇功能
  5. pythontrycatch所有异常状态_python 一篇搞定所有的异常处理
  6. matlab谐波含量,基于谐波检测中的数字低通滤波器的MATLAB设计
  7. 每日新闻丨五方面推动云计算产业发展;字节跳动与澎湃合资成立视听科技
  8. WinForm开发钉钉(1) 调用机器人发送消息到钉钉群
  9. 单缓冲、双缓冲、循环缓冲
  10. (附源码)php水果百科动态网站 毕业设计 060917