《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
实现:
结果打印:
㈠问题的描述
背包问题定义如下:设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
相关文章推荐
- 100个高质量Java开发者博客(20151220更新)
- 关于java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream解决办法
- JAVA并发编程笔记五
- 使用soot和graphviz画Java的控制流图
- Java语言中的四种引用
- 【OAuth2.0】Spring Security OAuth2.0篇之初识
- Spring 并发访问的线程安全性问题
- ACM中java的使用
- Java中的static关键字解析
- Sping Boot 初探(一)--- 一分钟构建SpringWeb
- [Eclipse] - eclipse集成jboss7.1
- jetty--jetty所需要的jdk版本问题
- [转]java 反射
- Maven实战(三)Eclipse构建Maven项目
- java位运算笔记
- 使用javax.mail实现邮件的发送
- 深度剖析Struts2中值栈的概念
- JavaException_处理异常
- Java中的锁——重入锁ReentrantLock
- 算法:哈夫曼编码算法(Java)