用动态规划解决0-1背包问题
0-1背包问题:给定n种物体和一个背包。物品i的重量是wi,其价值为vi,背包的容量为C,问:应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?
在选择将物品装入的时候,有两种选择,即装与不装。不能将同一件物品装入多次,也不能只装一部分物品。因此,该问题被称为0-1背包问题。
首先来分析一下,我们要放入一些物品,这些物品的总质量是不能超过背包的容量的,而且还要让他们的质量之和达到最大。怎么才能实现呢?
m(i,j)={max(m(i+1,j),m(i+1,j-wi)+vi)} j>=wi
当第i件物品的重量不超过背包容量的话,可以不装或者装。m(i+1,j)这个表示的是不装的情况,那么最优解存在于i+1至n。m(i+1,j-wi)+vi这个表示装入这个物品,那么背包的容量就会减少,减少至j-wi,此事最优解存在于剩下i+1中,还要加上第i个的质量。
=m(i+1,j) 0<=j<wi
当第i件物品超过背包容量的时候一定不能放了!那么就在剩下的i+1到n之间找最优解。
下面我们通过一个例题理解一下!
一个背包的容量为10,有5件物品,每件物品的重量分别为2,5,4,2,3。质量为6,3,5,4,6。怎么放能使总质量最大?
用从c【i,j】表示最大总质量,i是放前i件物品,j是背包容量,下面是c【i,j】的图
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 | 6 |
| 2 | 0 | 0 | 6 | 6 | 6 | 6 | 6 | 9 | 9 | 9 | 9 |
| 3 | 0 | 0 | 6 | 6 | 6 | 6 | 11 | 11 | 11 | 11 | 11 |
| 4 | 0 | 0 | 6 | 6 | 10 | 10 | 11 | 11 | 15 | 15 | 15 |
| 5 | 0 | 0 | 6 | 6 | 10 | 12 | 12 | 16 | 16 | 17 | 17 |
当背包容量为1时,不能放入物品,五种情况下总质量都为零。只能放一件物品的时候,经过分析可以知道,最大总质量不管怎么样都是6。剩下的自己试着写出来吧!
浙公网安备 33010602011771号