关闭

[置顶] 0-1背包 动态规划

2268人阅读 评论(0) 收藏 举报
分类:

给定n种物品和一个背包,物品i的重量是wi,价值vi,背包的重量是C,问如何选择装入背包的物品,使装入背包中的物品总价值最大?
对于每种物品只能选择完全装入或不装入,一个物品至多装入一次。

输入:整数C>0,整数wi>0,vi>0,1in
输出:(x1,x2,....,xn),xi{0,1},满足1inwixiC最大

问题优化子结构
Pi=[{i,i+1,.......,n},Ci=C1ki1wkxk]
代表物品1i1已经考虑完毕,物品in还没有被考虑是否被选择,此时背包剩余容量为C。

Si=(yi,yi+1,...,yn)yi{0,1},是背包问题Pi=[{i,i+1,.......,n},Ci=C1ki1wkxk]的优化解,那么其子问题Si+1=(yi+1,yi+2,...,yn)yi{0,1},是背包问题Pi+1=[{i+1,i+2,.......,n},Ci+1=C1kiwkxk]的优化解。

假设子问题的解Si+1=(yi+1,yi+2,...,yn)不是最优的,则存在Si+1=(zi+1,zi+2,...,zn)Pi+1的更优解。则Si=(zi,zi+1,...,zn)是问题PiSi更优的解,与Si是最优解矛盾。

子问题重叠性
{4,........,n},Cw3表示没有选择物品1、2、选择了物品三。

{4,........,n},Cw1w2表示选择了物品1、2,没有选择物品三。

{4,........,n},Cw1表示选择了物品1,没有选择物品2、3。

显然当w1+w2w3w1若有相同的值时,具有重叠子问题性,或者说,当wi有重叠时,存在大量重叠子问题。

定义代价矩阵m
矩阵元素m(i,j)是子问题Pi=[{i,i+1,......,n},j]的优化解(yi,yi+1,.....,yn)的代价,m(i,j)=iknvkyk

递归方程
[{i,i+1,......,n},j]

0j<wi,m(i,j)=m(i+1,j)

j>wi,m(i,j)=max{m(i+1,j),m(i+1,jwi)+vi}

[{n},j]
0j<wi,m(n,j)=0

j>wi,m(n,j)=vn

递归的划分子问题

这里写图片描述

自底向上计算优化解的代价
这里写图片描述

wi1<C
//初始已知值
For j=0 To wn1 Do
m[n,j]=0;

For j=wn To C Do
m[n,j]=vn;

For i=n1 To 2 Do
For j=0 To wi1 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,jwi)+vi};

IF C<w1 Then m[1,C]=m[2,C];
Elsem[1,C]=max{m[2,C],m[2,Cw1]+v1};

取消假设wi1<C

For j=0 To min(wn1,C) Do
m[n,j]=0;

For j=wn+1 To C Do
m[n,j]=vn;

For i=n1 To 2 Do
For j=0 To min(wn1,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,jwi)+vi};

IF C<w1 Then m[1,C]=m[2,C];
Elsem[1,C]=max{m[2,C],m[2,Cw1]+v1};

算法复杂性:

这里写图片描述

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:87229次
    • 积分:1594
    • 等级:
    • 排名:千里之外
    • 原创:72篇
    • 转载:2篇
    • 译文:0篇
    • 评论:9条
    博客专栏
    最新评论