您的位置:首页 > 其它

0/1背包问题 - 以 动态规划算法 去解

2017-06-18 21:16 204 查看
0/1背包问题 - 以 动态规划算法 去解

flyfish

0/1背包问题(0/1 knapsack problem)

我们有n种物品,编号是 0,1,2,3…,n-1,物品i的重量(weight)为wi,价值(value) 为vi。

我们假定所有物品的重量和价格都是非负的。

背包所能承受的最大重量(maximum weight capacity)为C。

限定每种物品只能选择0个或1个。

目的是得到动态规划的状态转移方程

物品个数n为4

承受的最大重量C=10

重量分别是 3, 5, 4, 2 (编号0,1,2,3)(编号也就是0,1,2,n-1)

价值分别是 30,20,10,40

最大价值是90(取编号0,1,3)

items={ 3, 30 }, { 5, 20 }, { 4, 10 }, { 2, 40 }

当n=4时,求的是4个物品, 装入重量为10的背包里能达到的最大价值

n=4 C=10

w =3, 5, 4, 2

v =30,20,10,40

当把第3个物品(从0编号)去掉问题变成

当n=3时,求的是3个物品, 装入剩余重量为8(10-2) 的背包里能达到的最大价值

n=3 C=8

w =3, 5, 4

v =30,20,10

最大价值是50(取编号0,1)

n个物品 (0,1,2…,n-1)装到剩余容量为C的背包中的最大价值

假设函数f表示最大价值

装入

f(4,10)=f(3,10-2)+40

=f(3,8 )+40

不装入

f(4, 10)=f(3, 10)

结果是

f(4,10)=max{ f(3,10), f(3,8)+40 } 装入与不装入 取最大值

n=1,2,3 表示任意其中一个定义为i,

表示任意一个重量定义为j

f(i, j)表示一个状态,下面就是状态转移方程

f(i, j)=max{ f(i-1, j), f(i-1,j-w[i-1]) + v[i-1] }

这个式子就是wiki第三个式子,只是字母不同

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息