简单的dfs入门例子

因为最近在做poj的题目。

刚好到1013题时候碰见stick问题。故看了下dfs方法

 

第一行是输入n个长度不同的小木枝条;第二行是每个小枝条的长度;第三行是让程序判断这些长度不同的小枝条能否组合成这个长度. 能输出ok,不能输出no

输入:

 4
 4 3 2 1
 7

输出:

 ok

这种方法很明显要对所有情况都要列出 即穷举

暴力解法dfs.

由于是入门,不考虑减枝(优化代码)的情况....

 

dfs(int i,int length)  // i为各个不同小枝条的编号, length为组合出的长度。

{

  if(i<n && vis[i])    // vis[n] 标记第n条小树枝的使用情况。 用到了为1 没用为0

  {

     vis[i]=1;     //现在用到了。

     if(length+a[i]==goal)   //长度刚好和目标相同 

        return ok=1;

     else if(length+a[i]=<goal)  //长度小于目标长度  继续dfs

     {

       dfs(i+1,length);  //舍弃a[i] 从[i+1]开始找

       dfs(i+1,length+a[i]);  //不舍弃a[i] 从[i+1]开始找      

     }

     else

     {

       dfs(i+1,length);  //因为a[i]明显大了,故舍弃a[i] 从[i+1]开始找

     }

     vis[i]=0;  //回溯

  }

 

通过这个简单的小例子,基本能明白了dfs的简单运用。

 

posted @ 2017-05-03 22:22  cagercoding  阅读(607)  评论(0)    收藏  举报