背包:01背包、完全背包
01背包
假设有一个背包的负重最多可达8公斤,而希望在背包中装入负重范围内可得到的总价最多的物品,水果的编号、单价与重量如下所示:
种类 | 重量 | 价值 |
---|---|---|
0 | 苹果 | 4 |
1 | 梨 | 5 |
2 | 桃 | 2 |
3 | 香蕉 | 6 |
4 | 橘子 | 1 |
思想:
动态规划,通过处理每个分阶段的最优结果,得到整个阶段的 最优结果。
把水果装进背包,如果想装的总价值最高,那么就要保证背包的所有空间都是装载的最高的价值,(因为东西是一点一点装进去的,背包不是一次就被装满的,每装一次,就会有不一样的剩余空间的大小和当前背包中物品的总价值,所以就会有很多的子阶段的结果,形成一个集合,所以我们用数组来表示结果, f[ f [ w] 为背包容量为w时的最优解,也就是价值的最大值)
<?php
//把每种物品的重量和价钱存在两个数组中
//分别为$weight , $value
$weight=[4,5,2,1,6];
$value=[4500,5700,2250,1100,6700];
$bao=8;
//用f 数组表示背包的总价格//初始化数组元素为0,当背包什么都没放的时候,总价格为0
for($i=0;$i<=$bao;$i++)
{
$f[$i]=0;
}
//依次放水果
for($i=0;$i<5;$i++)
{
for($j=$bao;$j>=$weight[$i];$j--)
// j 为背包的空间,$j>=$weight[$i] 是为了使操作有效,背包空间大于物品质量的时候才能放,空间不够就不放,就看下一个 $i++;
//i 为 0 时重量为4,那么当背包容量只剩下3时就不走了
{
//可以放,那就判断当下情况是放了之后价值高还是不放高,取其中最大值,作为当前背包容量为 j 的时候背包中最高的价值;(比较的时候注意放了之后的价值,是在背包总重量去除放的物品的重量的时候,剩余的容量能够放的最高的价值加上新放的物品的价值)
$f[$j]=max($f[$j],$f[$j-