给定n种物品和一个背包,物品i的重量是wi,价值vi,背包的重量是C,问如何选择装入背包的物品,使装入背包中的物品总价值最大?
对于每种物品只能选择完全装入或不装入,一个物品至多装入一次。
输入:整数C>0,整数wi>0,vi>0,1≤i≤n
输出:(x1,x2,....,xn),xi∈{0,1},满足∑1≤i≤nwixi≤C最大
问题优化子结构
Pi=[{i,i+1,.......,n},Ci=C?∑1≤k≤i?1wkxk]
代表物品1~i?1已经考虑完毕,物品i~n还没有被考虑是否被选择,此时背包剩余容量为C。
设Si=(yi,yi+1,...,yn),其中yi∈{0,1},是背包问题Pi=[{i,i+1,.......,n},Ci=C?∑1≤k≤i?1wkxk]的优化解,那么其子问题Si+1=(yi+1,yi+2,...,yn),yi∈{0,1},是背包问题Pi+1=[{i+1,i+2,.......,n},Ci+1=C?∑1≤k≤iwkxk]的优化解。
假设子问题的解Si+1=(yi+1,yi+2,...,yn)不是最优的,则存在S′i+1=(zi+1,zi+2,...,zn)是Pi+1的更优解。则S′i=(zi,zi+1,...,zn)是问题Pi比Si更优的解,与Si是最优解矛盾。
子问题重叠性
{4,........,n},C?w3表示没有选择物品1、2、选择了物品三。
{4,........,n},C?w1?w2表示选择了物品1、2,没有选择物品三。
{4,........,n},C?w1表示选择了物品1,没有选择物品2、3。
显然当w1+w2、w3、w1若有相同的值时,具有重叠子问题性,或者说,当wi有重叠时,存在大量重叠子问题。
定义代价矩阵m
矩阵元素m(i,j)是子问题Pi=[{i,i+1,......,n},j]的优化解(yi,yi+1,.....,yn)的代价,m(i,j)=∑i≤k≤nvkyk
递归方程
[{i,i+1,......,n},j]
0≤j<wi,m(i,j)=m(i+1,j)
j>wi,m(i,j)=max{m(i+1,j),m(i+1,j?wi)+vi}
[{n},j]
0≤j<wi,m(n,j)=0
j>wi,m(n,j)=vn
递归的划分子问题
自底向上计算优化解的代价
设wi?1<C
//初始已知值
For j=0 To wn?1 Do
m[n,j]=0;
For j=wn To C Do
m[n,j]=vn;
For i=n?1 To 2 Do
For j=0 To wi?1 Do
m[i,j]=m[i+1,j]
For j=wi To C Do
m[i,j]=max{m(i+1,j),m(i+1,j?wi)+vi};
IF C<w1 Then m[1,C]=m[2,C];
Elsem[1,C]=max{m[2,C],m[2,C?w1]+v1};
取消假设wi?1<C
For j=0 To min(wn?1,C) Do
m[n,j]=0;
For j=wn+1 To C Do
m[n,j]=vn;
For i=n?1 To 2 Do
For j=0 To min(wn?1,C) Do
m[i,j]=m[i+1,j]
For j=wi To C Do
m[i,j]=max{m(i+1,j),m(i+1,j?wi)+vi};
IF C<w1 Then m[1,C]=m[2,C];
Elsem[1,C]=max{m[2,C],m[2,C?w1]+v1};
算法复杂性: