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程序设计有所帮助。

相关文章

  • zen cart新进商品的随机排序修改方法

    zen cart新进商品的随机排序修改方法

    由于新进商品的数量可能比页面上能显示的数量多,所以采用的是随机显示的方式。如果想改为按时间顺序显示,可以按照radnows提供的 方法修改。(记住使用文件替代)
    2010-09-09
  • PHP实现的数独求解问题示例

    PHP实现的数独求解问题示例

    这篇文章主要介绍了PHP实现的数独求解问题,涉及php数组与字符串的遍历、比较、判断、运算等相关操作技巧,需要的朋友可以参考下
    2017-04-04
  • PHP 之 写时复制介绍(Copy On Write)

    PHP 之 写时复制介绍(Copy On Write)

    很多时候,我们会因为一些术语而对其概念产生莫测高深的恐惧,而其实,他们的基本原理往往非常简单。本小节将介绍PHP中写时复制这种策略的实现
    2014-05-05
  • PHP实现采集抓取淘宝网单个商品信息

    PHP实现采集抓取淘宝网单个商品信息

    这篇文章主要介绍了PHP实现采集抓取淘宝网单个商品信息,本文是一种实现思路,使用file_get_contents函数实现,并给出了采集正则,需要的朋友可以参考下
    2015-01-01
  • PHP+Mysql基于事务处理实现转账功能的方法

    PHP+Mysql基于事务处理实现转账功能的方法

    这篇文章主要介绍了PHP+Mysql基于事务处理实现转账功能的方法,实例分析了mysql事务处理的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • 利用PHP快速抓取音频数据的方法详解

    利用PHP快速抓取音频数据的方法详解

    这篇文章主要给大家介绍了如何利用PHP快速抓取音频数据,文中使用Dusk库和PHP编写的爬虫程序,用于爬取海量的音频数据,有详细的代码示例供大家参考,需要的朋友可以参考下
    2023-10-10
  • PHP操作文件方法问答

    PHP操作文件方法问答

    PHP操作文件方法问答...
    2007-03-03
  • php使用socket简单实现通信功能

    php使用socket简单实现通信功能

    socket只不过是一个数据结构。使用这个socket数据结构去开始一个客户端和服务器之间的会话。服务器是一直在监听准备产生一个新的会话。当一个客户端连接服务器,它就打开服务器正在进行监听的一个端口进行会话
    2023-03-03
  • php 数组使用详解 推荐

    php 数组使用详解 推荐

    对于网页编程来说,最重要的就是存取和读写数据了。存储方式可能有很多种,可以是字符串、数组、文件的形式等,今天学习了数组,可以说是PHP的数据应用中较重要的一种方式。
    2011-06-06
  • 功能强大的PHP发邮件类

    功能强大的PHP发邮件类

    这篇文章主要为大家详细介绍了功能强大的PHP发邮件类,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08

最新评论