背包算法

本文介绍了背包算法中的01背包和完全背包。01背包使用动态规划,确保背包空间最大化价值,每阶段结果通过判断并刷新得到最优解。完全背包则允许每种物品无限量放入,实现能装就装。两者主要区别在于01背包只能装一个物品,而完全背包可以多次装入同种物品。
摘要由CSDN通过智能技术生成

背包: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-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值