设为首页 收藏本站
查看: 489|回复: 0

[经验分享] 背包问题的PHP算法

[复制链接]

尚未签到

发表于 2017-3-28 14:13:10 | 显示全部楼层 |阅读模式
引用

<?php
// http://tieba.baidu.com/f?kz=283979751
/*
设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
Input
第一行:两个整数,M(背包容量,M<= 200)和N(物品数量,N<= 30); 第2..N+1 行:每行二个整数Wi,Ui,表示每个物品的重量和价值。
Output
仅一行,一个数,表示最大总价值。
Sample Input
12 4
2  1
3  3
4  5
7  9
Sample Output
15
*/
set_time_limit(30);
define(’NOWTIME’,time());
function microtime_float()
{
    list($usec, $sec) = explode(” “, microtime());
$sec=$sec-NOWTIME;
    return ((float)$usec + (float)$sec);
}
//初始化数组
/*
$bbw=12;
$arywp=array();
$arywp[]=array(’d',2,1);
$arywp[]=array(’c',3,3);
$arywp[]=array(’b',4,5);
$arywp[]=array(’a',7,9);
*/
$time_start = microtime_float();
//开始计算
$wpnum=count($arywp);
$wpnum=20; //允许的物品类型数量
$bbw=rand(5*$wpnum,50*$wpnum); //背包允许最大重量
for($i1=0;$i1<$wpnum;$i1++){ //初始化每个物品类型的重量和价值
$arywp[$i1][0]=”w”.$i1; //名称
$arywp[$i1][1]=rand(50,80); //重量
$arywp[$i1][2]=rand(20,50); //价值
$arywp[$i1][3]=$arywp[$i1][2]/$arywp[$i1][1];//单位重量的最大价值
}
function cmp($a, $b){
$returnvalue=0;
    if ($a[3] == $b[3]) {
  $returnvalue=  0;
    } else {
     $returnvalue = ($a[3] > $b[3]) ? -1 : 1;
}
return $returnvalue;
}
//按单位最大价值排序
usort($arywp, “cmp”);
print_r($arywp);
echo ” <br />\n”;
//递归函数,计算剩余空间的允许物品最大价值
function getmaxval($bbw,$arywp){
//最大单位物品的重量、价值、数量
$use_w=0;
$use_v=0;
$ary_userwp=array();
//当前空间的允许物品最大价值
$maxwgt=0;
$maxval=0;
$maxuserwp=array();

$wp = array_shift($arywp);
$num= floor(($bbw-$use_w)/$wp[1]); //最大单位物品的最大允许个数
//echo ” countmax : $num * “.$wp[0].”<br/>\n”;
if(count($arywp)==0 || $bbw-$use_w==$wp[1]*$num){ //没有剩余物品或刚好填满 //递归结束条件
  if($num>0){
   $maxwgt+=$wp[1]*$num;
   $maxval+=$wp[2]*$num;
   $maxuserwp[$wp[0]]=$num;
  }
} else {
  for($i=0;$i<=$num;$i++){ //计算最大单位物品不同数量时的最大价值
   $use_w=$wp[1]*$i;
   $use_v=$wp[2]*$i;
   $ary_userwp[$wp[0]]=$i;
   if(($num-$i)*$wp[2]/($bbw-$use_w) < $arywp[0][3]){ //剩余空间的单位价值小于下件物品的单位价值
    list($subuse_w,$subuse_v,$subusewp)=getmaxval($bbw-$use_w,$arywp);
   } else {
    $subuse_w=0;
    $subuse_v=0;
    $subusewp=array();
   }
   if($use_v+$subuse_v>$maxval || $maxval==0){ //比较最大价值
    $maxwgt=$use_w+$subuse_w;
    $maxval=$use_v+$subuse_v;
    if($i>0){
     $maxuserwp=array_merge($ary_userwp,$subusewp);
    } else{
     $maxuserwp=$subusewp;
    }
   }
  }
  //print_r($maxuserwp);
  //echo ” maxwgt : $maxwgt  maxval : $maxval<br/>\n”;
}
//返回 使用的重量,最大价值、使用的物品数量数组
return array($maxwgt,$maxval, $maxuserwp);
}
//开始计算
$arysulte= getmaxval($bbw,$arywp);
//输出结果
echo ” bbw “.$bbw.” “;
print_r($arysulte);
$time_end = microtime_float();
$runtime = $time_end – $time_start;
echo ” runtime : “.$runtime;
?>

原文链接http://www.bao00long.cn/2009/package.html

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-356596-1-1.html 上篇帖子: [转]php实现的thrift socket server 下篇帖子: PHP 之 函数 sprintf()
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表