01背包问题实现探究

参考博文http://blog.csdn.net/mu399/article/details/7722810

另外bilibili有个讲背包01的视频也挺生动的。

<?php
//背包01问题
class Item{
    public $weight;
    public $value;
    public function __construct($weight,$value){
        $this->weight = $weight;
        $this->value = $value;
    }
}
class Bag{
    private $items;
    public function __construct($items){
        $this->items = $items;
    }
    private  $resultMap = array();
    function bestBag($k,$w){
        if($k==0 || $w==0){
            return 0;
        }
        if(isset($this->resultMap[$k][$w])){
            return $this->resultMap[$k][$w];
        }
        if($k==1) {
            if ($this->items[$k]->weight > $w) {
                return 0;
            } else {
                return $this->items[$k]->value;
            }
        }
        $res1 = $this->bestBag($k-1,$w);
        if($w-$this->items[$k]->weight>0){
            $res2 = $this->bestBag($k-1,$w-$this->items[$k]->weight)+$this->items[$k]->value;
        }else{
            $res2 = 0;
        }
        $result = max($res1,$res2);
        if(!isset($this->resultMap[$k][$w])){
            $this->resultMap[$k][$w] = $result;
        }
        return $result;
    }
}

$items = array();
for($i = 1;$i<6;$i++){
    $item = new Item($i,$i+3);
    $items[$i] = $item;
}
print_r($items);
$bagTest = new Bag($items);
echo $bagTest->bestBag(5,60);exit;
时间: 2024-12-26 16:27:03

01背包问题实现探究的相关文章

动态规划之01背包问题(最易理解的讲解)

01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章力争做到用最简单的方式,最少的公式把01背包问题讲解透彻. 01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ),  f[i-1,j] } f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值. Pi表示第i件物品的价值. 决策:为了背包中物品总价值最大化,第 i件物品应该放入背包中吗 ? 题目描述: 有编号分别为a,b

01背包问题:POJ3624

背包问题是动态规划中的经典问题,而01背包问题是最基本的背包问题,也是最需要深刻理解的,否则何谈复杂的背包问题. POJ3624是一道纯粹的01背包问题,在此,加入新的要求:输出放入物品的方案. 我们的数组基于这样一种假设: totalN表示物品的种类,totalW表示背包的容量 w[i]表示第i件物品的重量,d[i]表示第i件物品的价值. F(i,j)表示前i件物品放入容量为j的背包中,背包内物品的最大价值. F(i,j) = max{ F(i-1,j) , F(i-1,j-w[i])+d[i

动态规划 - 0-1背包问题

0-1背包问题描述如下: 有一个容量为V的背包,和一些物品.这些物品分别有两个属性,体积w和价值v,每种物品只有一个.要求用这个背包装下价值尽可能多的物品,求该最大价值,背包可以不被装满.因为最优解中,每个物品都有两种可能的情况,即在背包中或者不存在(背 包中有0个该物品或者 1个),所以我们把这个问题称为0-1背包问题. 用dp[i][j]表示前i个物品在总体积不超过j的情况下,放到背包里的最大价值.由此可以推出状态转移方程: dp[0][j] = 0; dp[i][j] = max{dp[i

01背包问题的动态规划算法

01背包问题我最初学会的解法是回溯法,第一反应并不是用动态规划算法去解答.原因是学习动态规划算法的时候,矩阵连乘.最长公共子串等问题很容易将问题离散化成规模不同的子问题,比较好理解,而对于01背包问题则不容易想到将背包容量离散化抽象出子问题,从情感上先入为主也误以为动态规划算法不是解决01背包问题的好方法,实际上并不是这样的.另外,动态规划算法不对子问题进行重复计算,但是要自底向上将所有子问题都计算一遍,直到计算出最终问题的结果也就是我们要的答案,有点像爬山的感觉. 问题描述:给定n种物品和一背

ACM 01背包问题1

Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … The bone collector had a big bag with a volume of V ,and

算法学习 - 01背包问题(动态规划C++)

动态规划 01背包 问题描述 求解思路 代码实现 放入哪些物品 代码 动态规划 我在上一篇博客里已经讲了一点动态规划了,传送门:算法学习 - 动态规划(DP问题)(C++) 这里说一下,遇到动态规划应该如何去想,才能找到解决办法. 最主要的其实是要找状态转移的方程,例如上一篇博客里面,找的就是当前两条生产线的第i个station的最短时间和上一时刻的时间关系. minTime(station[1][i]) = minTime(station[1][i-1] + time[i], station[

【算法导论】0-1背包问题

一.0-1背包问题描述: 已知:小偷在店里偷东西,小偷只带了一个最大承重为W的背包,商店里有N件商品,第i件商品的重量是weight[i],价钱是value[i]. 限制:每种商品只有一件,可以选择拿或者不拿,不能分割,不能只拿一件商品的一部分(所以叫做0-1,0即不拿,1则整个拿走,且一种商品有且只有一件可供拿走) 问题:在不超过背包最大承重的情况下,最多能拿走多少钱的商品. 算导上与0-1背包问题对应的是分数背包问题,分数背包问题中的物品是可以取一部分的,就是说可以拆分的,不像0-1背包中,

0-1背包问题(动态规划)

<span style="font-size:18px;">#include<iostream> #include<vector> #include<iterator> #include<algorithm> #include<string> using namespace std; /* *0-1背包问题(动态规划) */ vector<vector<int>> values;//valu

01背包问题

01背包问题详解 题目 有N件物品和一个容量为V的背包.第i件物品的费用是c[i],价值是w[i].求解将哪些物品装入背包可使价值总和最大. 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放. 用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值.则其状态转移方程便是: f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]} 这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的.所以有必