当前位置:网站首页 > 技术博客 > 正文

01背包问题动态规划详解




01背包问题,是用来介绍动态规划算法最经典的例子,网上关于01背包问题的讲解也很多,我写这篇文章就是从一个小白的角度来理解01背包算法,因为我也是从小白过来的。

比如现在有四个物品,要把这四个物品放入一个容量为8的背包之中,然后现在要求这个背包最大能够放入价值为多少的物品?
在这里插入图片描述

接下来第一件事就是列表,不要问为什么,就是这个方法,这张表是至底向上,从左到右生成的。

首先第一行第一列
在这里插入图片描述
因为背包容量为0无法放入物品所以第一列的最大价值就全为0;
物体编号为0意味着放入前0个物品,也就是不放入物品,所以第一行的最大价值就全为0

填写第一行
在这里插入图片描述
填写第二行
在这里插入图片描述
以此类推写完全部
拿最后一个举例看看背包内价值最大的情况下,背包内装了哪些物品

在这里插入图片描述

解法归纳:
一、如果装不下当前物品
那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的。

二、如果装得下当前物品
假设1:
装当前物品,在给当前物品预留了相应空间的情况下,前n-1个物品的最佳组合加上当前的价值就是总价值

假设2:
不装当前物品,那么前n个物品的最佳组合和前n-1个物品的最佳组合是一样的。
选取假设1和假设2中的较大的价值,为当前的最佳组合的价值。

如果你看懂了以上的所有的流程,那现在下面这个式子就可以理解了。
01背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }
在这里插入图片描述
f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值。

回溯:
从表的右下角开始回溯,如果发现前n个物品最佳组合的价值和前n-1个物品最佳组合的价值一样,说明第n个物品没有被装入,否则第n个物品被装入


                            

  • 上一篇: pcap 格式
  • 下一篇: 左移运算符溢出
  • 版权声明


    相关文章:

  • pcap 格式2025-01-11 08:01:05
  • spring 跨域问题2025-01-11 08:01:05
  • seekbar设置进度值2025-01-11 08:01:05
  • 什么是 vsphere 的网络虚拟化平台?2025-01-11 08:01:05
  • 总结移位指令的使用方法2025-01-11 08:01:05
  • 左移运算符溢出2025-01-11 08:01:05
  • java匿名内部类可以继承其他类吗2025-01-11 08:01:05
  • 程序员java开发2025-01-11 08:01:05
  • 高级语言程序设计期末考试及答案2025-01-11 08:01:05
  • dos或linux2025-01-11 08:01:05