背包问题总结 二分法总结
经过这个周的acm学习,我们又学到了新的知识及其学习解决问题的新方法,那就是背包思维,背包问题其实分为两种有单纯的背包问题或者是0—1背包问题,而这两种背包问题,虽然名字上来说都是背包问题,但是区别还有很多的,我们就先来谈一谈这二者之间的区别吧。循环变量不同、约束条件不同、最大总价值不同。
一、循环变量不同。1、背包问题:背包问题须先求出列坐标j较小的元素,故让循环变量j的值从小到大递增。2、0-1背包问题:0-1背包问题须先求出列坐标j较大的元素,故让循环变量j的值从大到小递减。二、约束条件不同。1、背包问题:背包问题的约束条件是给定几种物品,物品可以取无限次。2、0-1背包问题:0-1背包问题的约束条件是给定几种物品,物品只可以取一次。三、最大总价值不同。
1、背包问题:背包问题若取了1件第i个物品,则总容量变为j-W[i],剩下的仍可以在前i件物品中去取,其最大总价值为B[i][j-W[i]] + P[i]。
2、0-1背包问题:0-1背包问题若取了1件第i个物品,则总容量变为j-W[i],剩下的只能在前i-1件物品中去取了,其最大总价值为B[i-1][j-W[i]] + P[i]。
然后我们再谈一谈背包问题的解决过程
在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。
1、建立模型,即求max(V1X1+V2X2+…+VnXn);
2、寻找约束条件,W1X1+W2X2+…+WnXn<capacity;
3、寻找递推关系式,面对当前商品有两种可能性:
包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);
还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}。
其中V(i-1,j)表示不装,V(i-1,j-w(i))+v(i) 表示装了第i个商品,背包容量减少w(i),但价值增加了v(i);
由此可以得出递推关系式:
j<w(i) V(i,j)=V(i-1,j)
j>=w(i) V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}
这里需要解释一下,为什么能装的情况下,需要这样求解(这才是本问题的关键所在!):
可以这么理解,如果要到达V(i,j)这一个状态有几种方式?
肯定是两种,第一种是第i件商品没有装进去,第二种是第i件商品装进去了。没有装进去很好理解,就是V(i-1,j);装进去了怎么理解呢?如果装进去第i件商品,那么装入之前是什么状态,肯定是V(i-1,j-w(i))。由于最优性原理(上文讲到),V(i-1,j-w(i))就是前面决策造成的一种状态,后面的决策就要构成最优策略。两种情况进行比较,得出最优。目前的背包问题基本上就是这种解题思路,也基本上囊括了背包问题的基本方法。
接下来就是二分法的理解及其总结
1.二分查找法只适用于从有序的队列中进行查找(比如数字和字母等),将队列排序后再进行查找
2.二分查找法的运行时间为对数时间O(㏒₂n) ,即查找到需要的目标位置最多只需要㏒₂n步,假设从[0,99]的队列(100个数,即n=100)中寻到目标数30,则需要查找步数为㏒₂100 , 即最多需要查找7次( 2^6 < 100 < 2^7)3.简单查询(遍历查询)的运行时间为线性时间O(n), 假设从[0,99]的队列中(n=100)寻到目标数30,则最多需要查找步数为100步。目前为止也就理解这么多而已,为了更深入的了解,还是要靠接下来更往后的学习了,相信自己以后会对此类问题有自己独特的见解和方法了。