您的位置:首页 > 编程语言 > Java开发

《JAVA》中利用《动态规划》实现《背包》问题

2015-12-20 16:09 615 查看
背包问题

㈠问题的描述

背包问题定义如下:设U={u1,u2,…,un}是一个准备放入背包中的n个物品的集合,si和vi分别为物品ui的体积和价值(1≤i≤n),背包的容量为C,si、vi和C均为正整数。要解决的问题是:从U中取出一些物品装入背包,装入物品的体积之和不超过C,使得背包中的物品的总价值为最大。

举例如下:

物品集合 U={u1,u2,u3,u4}

物品体积集合 S={s1,s2,s3,s4}={2,3,4,5}

物品价值集合 V={v1,v2,v3,v4}={3,4,5,8}

背包体积 C=9

正确答案是:在背包中装入物品u3和u4,物品总价值可达最大值13。

动态规划法

设Ui是物品集U的子集,它由U的前i项{u1,u2,…ui}构成。从Ui取出若干个物品装入体积为j的背包中,所形成的物品最大价值用V[i,j]表示(0≤i≤n、0≤j≤C),显然原问题可表示为V[n,C]。

V[0,j]=0 直观意义为:背包中无任何物品,最大价值为0;

V[i,0]=0 直观意义为:背包的容量为0,最大价值为0。

当i、j>0,V[i,j]是下面二个量的最大值。

V[i-1,j]:从物品子集Ui-1中取出若干物品装入体积为j的背包中所形成的价值最大值(即不装入物品ui);

V[i-1,j-si]+vi:从物品子集Ui-1中取出若干物品装入容量为j-si的背包中所形成的价值最大值。在此基础上,再加上物品ui的价值vi,显然j≥si (即装入物品ui)。

物品集合 U={u1,u2,u3,u4}

物品体积集合 S={s1,s2,s3,s4}={2,3,4,5}

物品价值集合 V={v1,v2,v3,v4}={3,4,5,7}

背包体积 C=9



求解V[i,j]核心之一:

if si>j then //物品ui体积si超过容量j,不装入。

V[i,j]←V[i-1,j] //取Ui-1的计算结果

else //物品ui体积si不超过容量j,可装入。

V[i,j]←max{V[i-1,j],V[i-1,j-si]+vi}

请注意i与j的变化规律:

i, i -1, i-2, i-3,….,i-i = 0

j-s1, j – s2, j-s3,…, 0

i与j最多有多少种组合? i*j种

最简单的情况是什么?

V[0,0], V[0,1]….V[0,j]

V[1,0]….V[i,0]

V[1,1],V[1,2],…V[1,j]

V[2,1],V[2,2],…,V[2,j]

背包算法伪代码:

Knapsack(Page 139)

输入:背包容量C、物品体积集合S={s1,s2,…,sn}、物品价值集合V={v1,v2,…,vn}。

输出:可装入背包物品的最大总价值。

(定义一个 二维数组V[0..n,0..C]用于计算和存放V[i,j]的值)

1. for i←0 to n V[i,0]←0 //背包容量为0

2. for j←0 to C V[0,j]←0 //背包未装入任何物品

3. for i←1 to n

4. for j←1 to C

5. if si>j then //物品ui体积si超过容量j,不装入。

6. V[i,j]←V[i-1,j] //取Ui-1的计算结果

7. else //物品ui体积si不超过容量j,可装入。

8. V[i,j]←max{V[i-1,j],V[i-1,j-si]+vi}

9. end if

10. end for

11. end for

12. return V[n,C] //返回最大总价值

关键算法方法

for i←1 to n

for j←1 to C

if si>j then //物品ui体积si超过容量j,不装入。

V[i,j]←V[i-1,j]//取Ui-1的计算结果

else //物品ui体积si不超过容量j,可装入。

V[i,j]←max{V[i-1,j],V[i-1,j-si]+vi}

end if

end for

end for

实现:





结果打印:

=======================背包问题=======================

======================第 1 次循环======================
VS[0][0] = 0
VS[0][1] = 0
VS[0][2] = 0
VS[0][3] = 0
VS[0][4] = 0
VS[0][5] = 0
VS[0][6] = 0
VS[0][7] = 0
VS[0][8] = 0
VS[0][9] = 0

======================第 2 次循环======================
VS[1][0] = 0
VS[i,j] = V[i-1,j] = VS[0][1] = 0
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][2] , VS[0][2-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][3] , VS[0][3-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][4] , VS[0][4-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][5] , VS[0][5-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][6] , VS[0][6-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][7] , VS[0][7-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][8] , VS[0][8-S[0]] + V0} = max{0, 03} = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[0][9] , VS[0][9-S[0]] + V0} = max{0, 03} = 3

======================第 3 次循环======================
VS[2][0] = 0
VS[i,j] = V[i-1,j] = VS[1][1] = 0
VS[i,j] = V[i-1,j] = VS[1][2] = 3
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][3] , VS[1][3-S[1]] + V1} = max{3, 04} = 4
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][4] , VS[1][4-S[1]] + V1} = max{3, 04} = 4
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][5] , VS[1][5-S[1]] + V1} = max{3, 34} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][6] , VS[1][6-S[1]] + V1} = max{3, 34} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][7] , VS[1][7-S[1]] + V1} = max{3, 34} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][8] , VS[1][8-S[1]] + V1} = max{3, 34} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[1][9] , VS[1][9-S[1]] + V1} = max{3, 34} = 7

======================第 4 次循环======================
VS[3][0] = 0
VS[i,j] = V[i-1,j] = VS[2][1] = 0
VS[i,j] = V[i-1,j] = VS[2][2] = 3
VS[i,j] = V[i-1,j] = VS[2][3] = 4
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][4] , VS[2][4-S[2]] + V2} = max{4, 05} = 5
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][5] , VS[2][5-S[2]] + V2} = max{7, 05} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][6] , VS[2][6-S[2]] + V2} = max{7, 35} = 8
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][7] , VS[2][7-S[2]] + V2} = max{7, 45} = 9
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][8] , VS[2][8-S[2]] + V2} = max{7, 45} = 9
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[2][9] , VS[2][9-S[2]] + V2} = max{7, 75} = 12

======================第 5 次循环======================
VS[4][0] = 0
VS[i,j] = V[i-1,j] = VS[3][1] = 0
VS[i,j] = V[i-1,j] = VS[3][2] = 3
VS[i,j] = V[i-1,j] = VS[3][3] = 4
VS[i,j] = V[i-1,j] = VS[3][4] = 5
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[3][5] , VS[3][5-S[3]] + V3} = max{7, 07} = 7
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[3][6] , VS[3][6-S[3]] + V3} = max{8, 07} = 8
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[3][7] , VS[3][7-S[3]] + V3} = max{9, 37} = 10
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[3][8] , VS[3][8-S[3]] + V3} = max{9, 47} = 11
VS[i,j] = max{VS[i-1][j],VS[i-1][j-S[i]]+V[i]} = max{VS[i-1][ j],VS[i-1][j-S[i-1]]+V[i-1]} = max{VS[3][9] , VS[3][9-S[3]] + V3} = max{12, 57} = 12

===============最后结果===============
0   0   0   0   0   0   0   0   0   0
0   0   3   3   3   3   3   3   3   3
0   0   3   4   4   7   7   7   7   7
0   0   3   4   5   7   8   9   9   12
0   0   3   4   5   7   8   10  11  12

背包的最大价值为:12
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: