PHP回溯法解决0-1背包问题实例分析

 更新时间:2015年03月23日 11:03:34   作者:疯狂一夏  
这篇文章主要介绍了PHP回溯法解决0-1背包问题,实例分析了php回溯法解决背包问题的技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了PHP回溯法解决0-1背包问题的方法。分享给大家供大家参考。具体分析如下:

这段代码是根据《软件设计师》教程的伪代码写的;
最麻烦的不是伪代码改成php,而是数组下标从0开始,及相应的下标判断问题;
带着调试输出一块写上

<?php
  $v_arr = array(11,21,31,33,43,53,55,65);
  $w_arr = array(1,11,21,23,33,43,45,55);
  $n = count($w_arr );
  //测试输出
  var_dump(bknap1(110));
//var_dump(bound(139,89,7,110));
  function bound($v,$w,$k,$W_total){
    global $v_arr,$w_arr,$n;
    $b = $v;
    $c = $w;
//var_dump($W_total);var_dump($n);var_dump($k);var_dump($v);var_dump($w);
//die;
    for($i=$k+1;$i<$n;$i++){
      $c = $c + $w_arr[$i];
      //var_dump($W_total);var_dump($c);
      if($c<$W_total)
        $b += $v_arr[$i];
      else{
//var_dump((1-($c-$W_total)/$w_arr[$i])*$v_arr[$i]);
        $b = $b+(1-($c-$W_total)/$w_arr[$i])*$v_arr[$i];
        return $b; 
      }
    }
    /*var_dump('------bound head');
    var_dump($k);
    var_dump($b);
    var_dump('------bound end');*/
    return $b; 
  }
  function bknap1($W_total){
    global $v_arr,$w_arr,$n;
    $cw = $cp = 0;
    $k = 0;
    $fp = -1;
    while(true){
      while($k<$n && $cw+$w_arr[$k]<=$W_total){
        $cw += $w_arr[$k];
        $cp += $v_arr[$k];
        $Y_arr[$k] = 1;
        $k +=1;
      }
//var_dump($cw);var_dump($cp);var_dump($Y_arr);var_dump($k);var_dump($n);
      if($k==$n){
        $fp = $cp;
        $fw = $cw;
        $k = $n-1;
        $X_arr = $Y_arr;
//bound($cp,$cw,$k,$W_total);
//var_dump(bound($cp,$cw,$k,$W_total),$fp,$k);die;
//var_dump($fp);var_dump($fw);var_dump($Y_arr);var_dump($k);var_dump($n);
      }else{
        $Y_arr[$k] = 0;
      }
//var_dump($Y_arr);var_dump($k);var_dump($n);//die;
//var_dump(bound($cp,$cw,$k,$W_total),$fp);die;
      while(bound($cp,$cw,$k,$W_total)<=$fp)
      {
        while($k>=0 && $Y_arr[$k]!=1){
          $k -= 1;
        }
        if($k<0)
        {
          return $X_arr;
        }
        var_dump($k);
        $Y_arr[$k] = 0;
        $cw -= $w_arr[$k];
        $cp -= $v_arr[$k];
      }
      $k += 1;
    }
  }
?>

希望本文所述对大家的php程序设计有所帮助。

相关文章

  • php 文件状态缓存带来的问题

    php 文件状态缓存带来的问题

    当使用以下函数时,会因为文件状态缓存,导致结果错误
    2008-12-12
  • PHP基于简单递归函数求一个数阶乘的方法示例

    PHP基于简单递归函数求一个数阶乘的方法示例

    这篇文章主要介绍了PHP基于简单递归函数求一个数阶乘的方法,结合实例形式分析了php递归函数的定义与数学运算简单操作技巧,需要的朋友可以参考下
    2017-04-04
  • PHP常用设计模式之委托设计模式

    PHP常用设计模式之委托设计模式

    委托是对一个类的功能进行扩展和复用的方法。它的做法是:写一个附加的类提供附加的功能,并使用原来的类的实例提供原有的功能,接下来通过本文给大家介绍PHP委托设计模式实例详解,感兴趣的朋友一起学习吧
    2016-02-02
  • php+mysql实现的无限分类方法类定义与使用示例

    php+mysql实现的无限分类方法类定义与使用示例

    这篇文章主要介绍了php+mysql实现的无限分类方法类定义与使用,结合实例形式分析了php+mysql无限分类方法类基本定义与使用方法,需要的朋友可以参考下
    2020-05-05
  • PHP的几个常用加密函数

    PHP的几个常用加密函数

    在网站的开发过程中,常常需要对部分数据(如用户密码)进行加密,本文主要介绍PHP的几个常见的加密函数,需要的朋友可以参考下
    2016-02-02
  • PHP实现变色验证码实例

    PHP实现变色验证码实例

    验证码想必大家都有见到过吧,在本文为大家介绍下PHP如何实现变色验证码,感兴趣的朋友可以参考下
    2014-01-01
  • 利用PHP实现开心消消乐的算法示例

    利用PHP实现开心消消乐的算法示例

    开心消消乐应该对大家来说都不陌生吧,下面这篇文章主要给大家介绍了关于如何利用PHP实现开心消消乐算法的相关资料,文中将需求和示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-10-10
  • 使用Codeigniter重写insert的方法(推荐)

    使用Codeigniter重写insert的方法(推荐)

    下面小编就为大家带来一篇使用Codeigniter重写insert的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • thinkphp5.0自定义验证规则使用方法

    thinkphp5.0自定义验证规则使用方法

    本文主要讲了thinkphp5.0版本中自定义验证规则的使用方法和一些注意事项。
    2017-11-11
  • 关于URL最大长度限制的相关资料查证

    关于URL最大长度限制的相关资料查证

    这篇文章主要介绍了关于URL最大长度限制的相关资料查证,这里记录一下,方便以后使用。
    2014-12-12

最新评论