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];
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 引言:这道题目老师强调了肯定要考,所以只有硬着头皮将其复习了;下面是自己学习回溯算法的学习,仅供参考;一:基本概念...
    cp_insist阅读 12,754评论 4 3
  • 背包问题 先从栗子出发,你是一个有理想的吃货,你的肚子只能容纳500g 的食物,为了保证你得到的价值(营养)最大化...
    scarqin阅读 4,432评论 0 1
  • 三尺高强电网,隔开的是两个世界,今天有幸第一次走进监狱参观,我们一行31人列队进入,三监建于上世纪八十年代,据监狱...
    跳舞的萤火虫阅读 1,783评论 0 0
  • 日记写得很随意,有时候写不了多少字,写不出内容,水平不行 有点像弟弟小的时候写作文,老师要求写100字,弟弟边写边...
    徐之李阅读 3,280评论 0 0
  • 自小就喜欢看武侠,古龙和金庸堪称是武侠江湖中的两位泰斗级人物。 古龙和金庸笔下的武侠江湖陪伴很多人走过了童年时光。...
    梦归秦淮_马乔阅读 6,691评论 23 42

友情链接更多精彩内容