• PHP经典算法之背包问题


    问题:假设有一个背包的负重最多可达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];



    作者:jadegg
    链接:https://www.jianshu.com/p/4e6f6b875697
    来源:简书
  • 相关阅读:
    对TCP/IP协议的理解
    自己想到的几道Java面试题
    Java双重循环实现任意字符串中提取数字子串
    Spring data jpa 依赖配置
    spring data jpa sql
    spring boot 依赖配置
    Freemarker模板和依赖
    spring Data solr依赖文件 和xml配置文件
    根据mysql数据库 定义solr Schema.xml中配置业务域
    自定义solr域中的配置
  • 原文地址:https://www.cnblogs.com/myJuly/p/13572707.html
Copyright © 2020-2023  润新知