迭带加深搜索

poj 2248 Addition Chains[迭代加深]

By admin 浏览(56)

题意:

加法链的 定义是第一个元素是1,最后一个是n,所有元素从小到大排列,并且除了1之外任意一个元素都是前面两个元素的和(那两个元素可相同),给定n,求元素最少的加法链.

思路:

做这个题,特意学了下迭代加深搜索,模型是:

for(deep=1; 1; deep++)

{

dfs(0);

If(find = true)

break;

}

它需要重复地从上往下搜,第一次搜到的就是问题的解,解空间比bfs小得多, 也不用像dfs那样需要搜所有的解。

查看源代码

打印帮助

01

#include <stdio.h>

02

#define N 100

 

03

int num[N];

04

int ans[N];

 

05

int deep;

06

int cnt;

 

07

int find;

08

int n;

 

09

 

10

void dfs(int k)

 

11

{

12

  int i, j;

 

13

  if(!find)

14

  {

 

15

    if(num[k] == n)

16

    {

 

17

      for(i=0; i<=k; i++)

18

        ans[i] = num[i];

 

19

      cnt = k;

20

      find = 1;

 

21

      return;

22

    }

 

23

    else if(k < deep && !find)

24

    {

 

25

      for(i=k; i>=0; i--)

26

      {

 

27

        if(num[i] * 2 > num[k])

28

          for(j=i; j>=0; j--)

 

29

          {

30

            if(num[i] + num[j] > num[k] && num[i] + num[j] <=n)

 

31

            {

32

              num[k+1] = num[i]+num[j];

 

33

              dfs(k+1);

34

            }

 

35

          }

36

      }

 

37

    }

38

  }

 

39

}

40

 

 

41

int main()

42

{

 

43

  int i;

44

  while(scanf("%d", &n), n)

 

45

  {

46

    find = 0;

 

47

    deep = 2;

48

    num[0] = 1;

 

49

    for(deep = 1; 1; deep++)

50

    {

 

51

      dfs(0);

52

      if(find)

 

53

        break;

54

    }

 

55

    for(i=0; i<cnt; i++)

56

      printf("%d ", ans[i]);

 

57

    printf("%d/n", ans[i]);

58

  }

 

59

  return 0;

60

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值