问题描述:
房间中有n件物品,每件物品具有固定的重量和价值,在背包总重量不超过W的情况下,如何组合物品使背包中物品总价值最大。
为了便于表示,首先对问题进行形式化建模。集合 S n = {
i | i = 0 , 1 , . . . , n − 1 } 表示可选取的物品集合, i 表示每件物品的编号,
| S n | = n
表示物品数目。 w i 、 v i 分别表示每件物品的重量和价值, W 表示背包承受重量的最大值。令
D = { B | B ∈ 2 S n ∧ ∑ i ∈ B w i ≤ W }
表示所有满足最大重量 W 限制的方案集合,则最优选取方案可以表示为:
F ( S n , W ) = C
,其中 C ∈ D , 且 ∀ C ′ ∈ D ⟹ ∑ i ∈ C v i ≥ ∑ j ∈ C ′ v j ,即集合 C 是所有可能的选取方案中价值最大的。我们用
f ( S n , W ) = ∑ i ∈ F ( S n , W ) v j
表示最优选择方案对应的最优值。
解题思路:有三种主要方法
1. 穷举法
这是是一个笨办法,但是对于问题规模小,并且不要求实时性的情况下,简单快捷。穷举法对应的Java代码如下:
public static int exhaustive (int [] weight,int [] value ,int W){
int length=weight.length;
int maxValue=-1 ;
int [] mask=new int [length];
for (int k=0 ;k<length;k++){
mask[k]=0x01 <<k;
}
for (int i=0 ;i<Math.pow(2 , length);i++){
int sumWeight=0 ;
int sumValue=0 ;
for (int j=0 ;j<length;j++){
if ((i&mask[j])>0 ){
sumWeight+=weight[j];
sumValue+=value [j];
}
}
if (sumWeight<=W && sumValue>maxValue)
maxValue=sumValue;
}
return maxValue;
}
穷举法的输入规模是指数级别的,为 2 | S n | 。
2.整数规划
整数规划是指一类要求问题中的全部或一部分变量为整数的数学规划,若在线性模型中,变量限制为整数,则称为整数线性规划。目前所流行的求解整数规划的方法往往只适用于整数线性规划。0-1背包问题是典型的整数线性规划问题。MATLAB中提供了 i n t l i n p r o g