码迷,mamicode.com
首页 > 其他好文 > 详细

0-1背包 动态规划

时间:2016-06-02 13:55:49      阅读:229      评论:0      收藏: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=C?1ki?1wkxk]
代表物品1i?1已经考虑完毕,物品in还没有被考虑是否被选择,此时背包剩余容量为C。

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

假设子问题的解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},C?w3表示没有选择物品1、2、选择了物品三。

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

{4,........,n},C?w1表示选择了物品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,j?wi)+vi}

[{n},j]
0j<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};

算法复杂性:

技术分享

0-1背包 动态规划

标签:

原文地址:http://blog.csdn.net/niujiabinbin/article/details/51555154

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!