Chinaunix首页 | 论坛 | 博客
  • 博客访问: 389876
  • 博文数量: 61
  • 博客积分: 2525
  • 博客等级: 少校
  • 技术积分: 455
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-24 13:22
文章分类

全部博文(61)

文章存档

2008年(4)

2007年(57)

我的朋友

分类: C/C++

2007-09-30 17:04:14

最近因为想看看算法..所以学习了一下基本的算法,回溯是一类非常重要的算法,从理论上说,任何问题都可以用回溯解决,呵呵,有点过了..其实回溯的应用还是非常典型的,在利用回溯求解之前,先考虑一下问题的求解是不是很多,而且可以用求解树来表示解空间..
 
不多说了..一般回溯都用到DFS(深度遍历)
而且对于回溯有个固定的模式:
 
 

{
(1)判断是否到了底层,是则返回上一层;
   (2)否则对各种可能情况进行循环:
   {
   if possible
      加入标记;
      进入下一层; //递归调用

      清除标记;
   else
      if 所有情况列举完毕,则返回上一层
   }
}

例如:

输入正整数t、n,以及n个正整数(单调非递增)。
n问题:若n个数中存在某几个数的和是t,则输出这些加法表达式(表达式不重复输出) ;若无解,则输出“NONE”。

Input:
4 7 4 4 3 2 2 1 1

output:
Sums of 4:
4
3+1
2+2
2+1+1

那么:n寻找t的和式,n个数,每个数取或不取,伪代码:

findsum(计算sum,判断第i个数) {
        if (i==n) return; //到达最后一个数的后面

        newsum=sum-第i个数; //取了i层数据

        if (newsum<0) return; //返回上一层,回溯
        if (newsum==0) 输出结果;
        else{ 标记取了第i个数;
            findsum(计算newsum, 判断第(i+1)个数);
        }
        清除第i个数的标记;
        findsum(计算sum,判断第(i+1)个数); //不取i层数据,递归下一层
  }

这里,利用t值减去选中的数,最后测试结果是否为0..

阅读(2262) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~