01背包详解

来源:互联网 发布:c语言三角形判断 编辑:程序博客网 时间:2024/06/13 11:47


01背包

看了2天的01背包,感觉现在真的是懂了,记录一下,这样才能记得更加深刻,其实早就接触过01背包,当时一知半解的,今天看了书本和别人的博客,真的很有用:

1、  描述一下01背包问题

有n个重量和价值分别为wi,vi,的物品,从这些物品中挑选出总重量不超过W的物品,求所有的挑选方案中价值总和的最大值。(这里需要注意的问题每一件物品只有一件)。

2、   其实对于每一个物品我们有2种选择,那就是选择与不选择;所以我们可以按照DFS对每一种情况进行搜索,这样也是可以求出最后的结果(不知道是不是所有的dp问题都可以用递归的来解答,有待学习)

3、    下面主要是对dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);

进行讲解,dp【i】【j】描述的什么意思?当背包的承重为j时,选择的物品有1-i,能够得到的最大值(这里需要重点理解,一定要好好琢磨一下)。

4、     下面就是代码:(我们看着代码进行分析)

for(i=1;i<=n;++i){for(j=0;j<=w;++j){ if(j<w[i])dp[i][j]=dp[i-1][j];else dp[i][j]=get_max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]); } } 

看着代码我们会发现,其实是一种递推关系dp【i】【j】,对于j的值,0-W,对每一个j的值我们求出最大值,当然这是在i-1的基础上求解的,就是这样一直递推下去;其实画一个二维表就很清楚了,如下:

n=4,W=5,(2,3),(1,2),(3,4),(2,2);以这个为例子进行画表


这是按照代码填写的二维表,其实填了几行你就会发现,i从1-4,每加入一个物品,都要从i-1个物品中j从0-5去一一计算加入i物品的最大值,当然j的值也是从小到大0-5;

每次加入一个物品都保证了j(0-5)的值中的最大值,也就是最优解,(可能表达的不好,具体自己画一下二维表,强烈建议画二维表),这个代码还可以推广到一维的形式,具体我会慢慢的讲解。



1 0
原创粉丝点击