一:背包问题:
我们有n种物品,物品j的重量为wj,价格为pj。我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。
1:0-1背包问题。如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。可以用公式表示为:
- 最大化
- 受限于
2:有界背包问题。如果限定物品j最多只能选择bj个,则问题称为有界背包问题。可以用公式表示为:
- 最大化
- 受限于
3:无界背包问题。如果不限定每种物品的数量,则问题称为无界背包问题。
其他,比如还有能否从n种物品中找到能满足重量为W的组合等各种背包问题的变种。
下面我们讨论的是第一种也是最常见的一种0-1背包问题。典型的背包问题可以使用贪心算法,而因为物品有两个属性,重量和价格,所以贪心的时候参照属性可以有两个重量和价格;而另外一种可以是按照重量和价格的比例来进行贪心,即rj=wj/pj。对于贪心算法的具体求解过程我们暂不进行详细说明。
当然也可以使用动态规划进行解决,动态规划的思想。
二:近似装箱问题
是指的N项物品,大小为s1,s2…sn,所有大小都满足0<si<1。问题是如何把这西物品装到最少的箱子中,每个箱子大小都为1。
比如0.2, 0.5, 0.4, 0.7, 0.1, 0.3 ,0.8。需要三个箱子装箱,
利用贪心三种解法:
1:下项适合,即下一个物品能否装进刚刚正在装的箱子中,如果不能则重新找一个箱子;
2:首项适合:即对于一个箱子,在剩下的物品中遍历所有物品,找看有物品可装进当前箱子,如果没有则重新找一个箱子,这个需要O(n * n)的复杂度;
3:最佳适合:即对下一个物品进行寻找所有箱子中装进该物品可以让这个箱子达到最满的那个箱子。