美文网首页PHP
PHP经典算法之背包问题

PHP经典算法之背包问题

作者: jadegg | 来源:发表于2017-06-14 21:38 被阅读0次

    问题:假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得之总价物品,假设是水果好了,水果的编号、单价与重量如下所示:
    1 栗子 4KG $4500
    2 苹果 5KG $5700
    3 橘子 2KG $2250
    4 草莓 1KG $1100
    5 甜瓜 6KG $6700
    分析:背包问题是关于最佳化的问题,要解最佳化问题可以使用「动态规划」(Dynamic programming),从空集合开始,每增加一个元素就先求出该阶段的最佳解,直到所有的元素加入至集合中,最后得到的就是最佳解。
    源码

    //背包承重上限
    $limit = 8;
    //物品种类
    $total = 5;
    //物品
    $array = array(
                array("栗子", 4, 4500),
                array("苹果", 5, 5700),
                array("橘子", 2, 2250),
                array("草莓", 1, 1100),
                array("甜瓜", 6, 6700)
                );
    //存放物品的数组
    $item = array_fill(0, $limit + 1, 0);
    //存放价值的数组
    $value = array_fill(0, $limit + 1, 0);
    $p = $newvalue = 0;         
    for ($i = 0; $i < $total; $i++) {
        for ($j = $array[$i][1]; $j <= $limit; $j++) {
            $p = $j - $array[$i][1];
            $newvalue = $value[$p] + $array[$i][2];
            //找到最优解的阶段
            if ($newvalue > $value[$j]) {
                $value[$j] = $newvalue;
                $item[$j] = $i;
            }
        }
    }
    echo "物品  价格<br />";
    for ($i = $limit; 1 <= $i; $i = $i - $array[$item[$i]][1]) {
        echo $array[$item[$i]][0] . "  " . $array[$item[$i]][2] . "<br />";
    }
    echo "合计  " . $value[$limit];
    

    相关文章

      网友评论

        本文标题:PHP经典算法之背包问题

        本文链接:https://www.haomeiwen.com/subject/gyveqxtx.html