问题描述:
有n种物品和一个重量为W的背包,第i种物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包重量,且物品总价值价值最大。假设n=5,W=17。
求解步骤:
1、刻画0-1背包最优解结构;
如果有n个物品,用Xi表示第i个物品的状态。Xi 的值为0或1。0表示物品未进入背包,1表示物品进入背包。
如果一个最优解中包含n,即Xn=1,那么其余X1,X2,…,X(n-1)一定构成子问题1,2,…,(n-1)在容量W-wi的最优解。如果Xn=0,则构成在W时的最优解。
2、递归定义最优解的值;
c[ i,w ]表示背包容量为w时i个物品导致的最优解的总价值。得到下式:
第一种情况:i=0和w=0分别表示放入的物品个数为0,背包容量为0,此时谈不上物品的总价值。
第二种情况:wi>w表示第i个物品的重量大于背包的重量,此时i放不进去,构成在i-1上的最优解的问题。
第三种情况:表示物品i可以放入,此时求总价值最大有两种情况:i在包中,总价值为c[i-1,w-wi]+vi;i不在包中,同第二种情况,转换为在i-1上的最优解问题,即c[i-1,w]。
3、计算背包最优解的值。、 由上述公式,考虑一个问题的最优解必须依赖前一个子问题的最优解,所以我们从背包容量为0开始考虑,逐渐增大背包容量,体现一个动态的过程,而考虑在可选物品是否应该放入背包中时,我们先拿一个物品是否在不在,然后在此基础上考虑另一个物品在不在,在比较在或不在求最大价值体现规划的过程。
表示背包容量动态变化过程中,物品是否可以放入,1表示放入,*表示不能放入。
表示 物品按单位价值比顺序考虑问题最优解。
使用场景:
最优子结构:如果一个问题的最优解中包含子问题的最优解,就说该问题具有最优子结构。当然一个问题具有最优子结构时贪心也可能适用。
重叠子问题:对每个子问题仅计算一次,把解保存在一个在需要时可以查看的表中。
对比分治法:
待解问题也分解成若干子问题,但子问题都不独立,用一个表来记录所有已解决子问题的答案,不管子问题是否被用到,只要计算过,就将其结果填入表中。