01背包问题

01背包问题最常见的就是设有N件物品和一个容量为V的背包。第i件物品占用背包空间大小为c[i],价值为w[i]。求解将哪些物品装入背包使价值总和最大。

首先分析问题可以得到,设一个数组f[N][V],其表示一个有N行V列的数组,数组初始化为全零数组。这个数组用来存放装入背包物品的价值,当我们要往背包中放入第i件物品的时候,我们需要比较放入第i件物品背包占用的空间大小与物品占用该空间大小带来的价值的关系。

所以我们通过如下式子来计算f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}。其中f[i][v]表示在面对第i件物品时,背包大小为v时所能获得的最大价值。其中v<=V,表示背包容量为v。

当c[i]>v时,物品容量超过背包容量,则放不了第i件物品,则f[i][v]=f[i-1][v]。此时最大价值只能是背包容量为v放第i-1件物品时的价值。

当c[i]<v时,表示背包可以放下第i件物品。我们要对放第i件物品带来的最大价值与不放第i件物品的最大价值进行比较。对于放第i件物品的最大值,我们不仅要考虑能放下第i件物品带来的价值,也还要考虑利用放完第i件物品后背包剩余空间的所带来的价值。所以放第i件物品带来的最大价值为f[i-1][v-c[i]]+w[i]。其中f[i-1][v-c[i]]表示放第i-1件物品背包大小为v-c[i]是所获得的最大价值。这个是为了充分利用背包放入第i件物品之后剩余空间所带来的价值。剩余空间中放入物品带来的价值与第i件物品的价值之和为背包放入第i件物品的最大价值。但是有可能背包大小为v时放入第i-1件物品时的最大价值大于放入第i件物品的最大价值。例如背包大小为10,背包中可以放入容量为10价值为10的一件物品。也可以放入容量为6价值为5,容量为4价值为4的两件物品。其中f[i-1][v]=10,f[i-1][v-c[i]]=4,w[i]=5。所以式子中要用max来比较大小。

伪代码如下:

for(int i=1;i<N;i++)
{
    for(int v=V;v>0;v--)
    {
        if(c[i]<v)
            f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]};
        else
            f[i][v]=f[i-1][v];
    }
}

如果需要更详细的解释请看下面这个链接:

https://blog.csdn.net/xp731574722/article/details/70766804

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值