算法之背包问题

   可分的背包问题是可以用贪心法来解决,而0-1背包问题通常使用动态规划方法来解决。

可分背包问题
       在可分背包问题中,物品可以被分割,您可以取走物品的一部分以适应背包的容量。这里的关键是物品的价值密度,即单位重量的价值。您可以按照价值密度从高到低的顺序选择物品,先取价值密度最高的物品,然后是次高的,依此类推,直到背包装满为止。这种方法称为贪心算法,因为它每一步都选择当前看起来最优的选项。

0-1背包问题
       与可分背包问题不同,0-1背包问题中的物品不能分割。您必须决定是否将整个物品放入背包。这就需要使用动态规划来找到最优解。动态规划通过考虑所有可能的组合来确保找到最大价值。它使用一个二维数组 ( dp[i][w] ) 来存储对于前 ( i ) 个物品,当背包容量为 ( w ) 时的最大价值。状态转移方程如下:

𝑑𝑝[𝑖][𝑤]=max⁡(𝑑𝑝[𝑖−1][𝑤],𝑑𝑝[𝑖−1][𝑤−𝑤𝑒𝑖𝑔ℎ𝑡[𝑖]]+𝑣𝑎𝑙𝑢𝑒[𝑖])

       这里,( dp[i-1][w] ) 表示不选择第 ( i ) 个物品时的最大价值,而 ( dp[i-1][w-weight[i]] + value[i] ) 表示选择第 ( i ) 个物品时的最大价值。通过这种方式,动态规划确保了在每一步都考虑了所有可能的选择,从而找到了最优解。

软考上也是有类似的题的。

请填写1到4个空。

我来解释这道题吧

首先将c这个二维数组变为0,也就是初始化,那个Memoized_Knapsack这个函数,将c二维数组设置为-1,-1就是已经结束的意思,然后执行Calculate_Max_Value这个函数,这个函数第一件事情就是判断c[i][j]是否为-1,如果是-1就已经结束了,所以这个1这个空应该填c[i][j]。第二个if判断也不难看出就是简单的将物体数量为0的设置为0,把背包容量为0的设置为0.,倘若不知道下面的i,和j代表的什么可以看我上面写的。i是物品数量,j是背包容量。

所以第二个空应该是j>=w[i],因为只有剩余的背包容量大于或者等于w[i]里面的容量,才可以被选进去,第三个空是再次调用Calculate_Max_Value(v,w,i-1,j-w[i])+v[i]  ,当c[i][j]选的值比那个temp小的时候,就进行一次互换就行了,也就是c[i][j]=temp。

总结:我觉得很好理解吧,求取到第i的物品的价格就是c[i][j],然后求下一个物品和之前的总价格temp,在与之比较,就行了。

  • 11
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanshaws

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值