SSL1045 01背包题解
题目描述:
一共有 N N N件物品
每件物品有两个属性:
重量 : w i w_i wi
价值 : p i p_i pi
现在有一个背包容量为 W W W. 问这个背包最多可以装价值为多少的物品?
输入:
4 10 //第一个数表示物件个数n,第二个数表示背包重量
5 8 //第一个表示物体得量,第二个表示价值,以此类推
3 6
4 7
2 5
输出:
19 //最大价值
分析:
显然这个题可用深度优先方法对每件物品进行枚举(选或不选用0,1控制). 程序简单,但是当 N N N的值很大的时候不能满足时间要求,时间复杂度为 O ( 2 n ) O(2^n) O(2n)
所以我们考虑用动态规划来做
首先定义一个二维数组 f i , j f_{i,j} fi,j
用 f i , j f_{i,j} fi,j表示前i个物品放入体积为 V V V的背包背包取得的最大价值
在考虑我们有两种操作,要么要,要么不要。
如果不要就很简单了,只要继承前面的就行了
如果要的话,我们则需要将背包容量腾出一点来,再加上价值
那么状态转移方程就很容易列出来了, f i , j f_{i,j} fi,j= m a x max max( f i − 1 ,