动态规划 - 0-1背包问题
有一个背包,容量为c。
有n个物体X0,X1,X2,...,Xn-1,重量分别为W0,W1,W2,...,Wn-1,价值分别为V0,V1,V2,...,Vn-1。
将这n个物体中的任意几个放入背包,使得在不超过背包容量的情况下,背包中的物体总价值最大。
数学描述:
c>0
Wi>0, Vi>0, 0<=i<=n-1
求:[X0,X1,X2,...,Xn-1],其中Xi=0或1,使得X0*V0+X1*V1+...+Xn-1*Vn-1最大
约束条件:X0*W0+X1*W1+...+Xn-1*Wn-1 <= c
(1)最优子结构
假设[X0,X1,X2,...,Xn-1]是 0~n-1个物体且最大值为c 的最优解,
那么[X0,X1,X2,...,Xn-2]是 0~n-2个物体且最大值为c-(Xn-1*Wi-1) 的最优解。可用反证法证明。
(2)建立递归关系
以max[i][j]作为 0~i个物体且最大容量为j 的最优解,易知max的维度为 n*(c+1)
当i=0时:如果 j<W0,max[i][j]=0
如果 j>=W0,max[i][j]=Vi
当i>=0时:如果 j<Wi,max[i][j]=max[i-1][j]
如果 j>=Wi,max[i][j]=MAX(max[i-1][j], max[i-1][j-Wi]+Vi)。分为包含Xi和不包含Xi两种。
(3)自底向上,计算各个子问题的最优解
详细情况(2)中已描述
(4)求解整个问题的最优解
max[n-1][c]即是整个问题的最优解,即最大价值。
从max[n-1][c]开始向前追溯,如果 max[i][j] == max[i - 1][j],就是不包含Xi,否则就是包含Xi。
代码:
[0, 1, 4]max : 15