01背包问题:假设有一个背包的容量为V,现有n件物品,每件物品的体积为v1,v2,。。。vn,与之对应的价值为p1,p2,。。。pn。问,如何选择物品,使得所装入背包中的物体的价值总和最大?
解题思路:每个物体可以选择放或不放进背包,那么n件物体共有2的n次方种方案。所以最直接的方法就是搜索,其时间复杂度为O(2^n).
dp[i][v]=max{dp[i-1][v],dp[i-1][v-vi]+pi}
该状态转移方程中,{dp[i-1][v]表示第i件物体不装入背包中,,dp[i-1][v-vi]+pi表示第i件物体装入背包中。
(1)若背包必须装满。则可初始化如下:
dp[0]=0,dp[1...V]=-∞。表示当容积为0时,只接受一个容积为0的物品入包。
(2)若背包可以空下。则初始化如下:
解题思路:每个物体可以选择放或不放进背包,那么n件物体共有2的n次方种方案。所以最直接的方法就是搜索,其时间复杂度为O(2^n).
最常用的方法是动态规划法来求背包问题。其思路是这样的:
用dp[i][v]表示前i件物体在背包容量为v的情况下装入物体的最大价值。那么在考虑第i件物品时,可以选择装入或不装入。则其状态转移方程为:dp[i][v]=max{dp[i-1][v],dp[i-1][v-vi]+pi}
该状态转移方程中,{dp[i-1][v]表示第i件物体不装入背包中,,dp[i-1][v-vi]+pi表示第i件物体装入背包中。
空间优化,将二维数组优化为一位数组dp[v],需要注意的是,必须将v递减的方式进行遍历。
初始化要分两种情况:(1)若背包必须装满。则可初始化如下:
dp[0]=0,dp[1...V]=-∞。表示当容积为0时,只接受一个容积为0的物品入包。
(2)若背包可以空下。则初始化如下:
dp[0...V]=0.表示任意容积的背包都有一个有效解即为0
举例如下图: