背包问题求解总结
来源:互联网 发布:奔驰路虎宝马编程电源 编辑:程序博客网 时间:2024/04/28 10:31
背包承重为10,价值是V的物品,重量为W,求解装的最大价值
C=10
i V W
1 10 2 最优解:60
2 20 4
3 30 6
4 40 5
10到0的最大价值初始都为0
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
0 0 0 0 0 0 0 0 0 0 0
for (i = 1; i <= 4; i++)
{
for (int c = 10; c >= c[i]; c--)
{
if(f[c - weightArray[i]] + valueArray[i] >= f[c])
{
f[c]=f[c - weightArray[i]] + valueArray[i];
}
}
}
f[c - weightArray[i]] + valueArray[i] f[c]
i=1 weightArray[i]=2 valueArray[i]=10
c=10 f[8] + 10 = 10 >= f[10] = 0
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
10 0 0 0 0 0 0 0 0 0 0
c=9 f[7] + 10 = 10 >= f[9] = 0
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
10 10 0 0 0 0 0 0 0 0 0
c=8 f[6] + 10 = 10 >= f[8] = 0
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
10 10 10 0 0 0 0 0 0 0 0
c=7 f[5] + 10 = 10 >= f[7] = 0
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
10 10 10 10 0 0 0 0 0 0 0
c=6 f[4] + 10 = 10 >= f[6] = 0
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
10 10 10 10 10 0 0 0 0 0 0
c=5 f[3] + 10 = 10 >= f[5] = 0
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
10 10 10 10 10 10 0 0 0 0 0
c=4 f[2] + 10 = 10 >= f[4] = 0
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
10 10 10 10 10 10 10 0 0 0 0
c=3 f[1] + 10 = 10 >= f[3] = 0
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
10 10 10 10 10 10 10 10 0 0 0
c=2 f[0] + 10 = 10 >= f[2] = 0
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
10 10 10 10 10 10 10 10 10 0 0
i=2 weightArray[i]=4 valueArray[i]=20
c=10 f[6] + 20 = 30 >= f[10] = 10
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
30 10 10 10 10 10 10 10 10 0 0
c=9 f[5] + 20 = 30 >= f[9] = 10
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
30 30 10 10 10 10 10 10 10 0 0
c=8 f[4] + 20 = 30 >= f[8] = 10
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
30 30 30 10 10 10 10 10 10 0 0
c=7 f[3] + 20 = 30 >= f[7] = 10
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
30 30 30 30 10 10 10 10 10 0 0
c=6 f[2] + 20 = 30 >= f[6] = 10
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
30 30 30 30 30 10 10 10 10 0 0
c=5 f[1] + 20 = 20 >= f[5] = 10
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
30 30 30 30 30 20 10 10 10 0 0
c=4 f[0] + 20 = 20 >= f[4] = 10
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
30 30 30 30 30 20 20 10 10 0 0
i=3 weightArray[i]=6 valueArray[i]=30
c=10 f[4] + 30 = 50 >= f[10] = 30
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
50 30 30 30 30 20 20 10 10 0 0
c=9 f[3] + 30 = 40 >= f[9] = 30
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
50 40 30 30 30 20 20 10 10 0 0
c=8 f[2] + 30 = 40 >= f[8] = 30
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
50 40 40 30 30 20 20 10 10 0 0
c=7 f[1] + 30 = 30 >= f[7] = 30
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
50 40 40 30 30 20 20 10 10 0 0
c=6 f[0] + 30 = 30 >= f[6] = 30
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
50 40 40 30 30 20 20 10 10 0 0
i=4 weightArray[i]=5 valueArray[i]=40
c=10 f[5] + 40 = 60 >= f[10] = 50
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
60 40 40 30 30 20 20 10 10 0 0
c=9 f[4] + 40 = 60 >= f[9] = 40
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
60 60 40 30 30 20 20 10 10 0 0
c=8 f[3] + 40 = 50 >= f[8] = 40
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
60 60 50 30 30 20 20 10 10 0 0
c=7 f[2] + 40 = 50 >= f[7] = 30
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
60 60 50 50 30 20 20 10 10 0 0
c=6 f[1] + 40 = 40 >= f[6] = 30
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
60 60 50 50 40 20 20 10 10 0 0
c=5 f[0] + 40 = 40 >= f[5] = 20
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
60 60 50 50 40 40 20 10 10 0 0
C=10
i V W
1 10 2 最优解:60
2 20 4
3 30 6
4 40 5
f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
60 60 50 50 40 40 20 10 10 0 0
承重10的最大价值60
求解思路理解: 把所有的承重的最大值算出来
f[c]=f[c - weightArray[i]] + valueArray[i];
i V W f[10] f[9] f[8] f[7] f[6] f[5] f[4] f[3] f[2] f[1] f[0]
1 10 2 10 10 10 10 10 10 10 10 10 0 0
2 20 4 30 30 30 30 30 20 20 10 10 0 0
3 30 6 50 40 40 30 30 40 20 10 10 0 0
4 40 5 60 60 50 50 40 40 20 10 10 0 0
为什么要使用f[c - weightArray[i]]
因为放入weightArray[i]的重量后,还剩c - weightArray[i]
c = c - weightArray[i] + weightArray[i]所能承受的最大重量
所以比较就是为了取舍
是留下f[c],还是留下剩余重量的价值f[c - weightArray[i]] + i件物品的价值valueArray[i]
- 背包问题求解总结
- 求解背包问题
- JAVA求解背包问题
- 背包问题-暴力求解
- 背包问题求解 - java
- 背包问题求解
- 求解背包问题
- 背包问题求解
- 背包问题 求解个数
- 贪婪法求解背包问题
- 01背包问题的求解
- 贪心法求解背包问题
- 模拟退火背包问题求解
- 贪心算法求解背包问题
- 背包问题(01背包和完全背包)java求解
- 背包问题(01背包和完全背包)java求解
- 用贪心算法求解背包问题
- 回溯法求解0/1背包问题
- GEF常见问题1:为图形编辑器设置背景图片
- Windows server 2008修改IIS7的文件上传大小限制解决方案
- 一些参数,弥补CMS(Concurrent Mark-Sweep)收集器的缺点
- 【BZOJ3043】IncDec Sequence
- 【PB】PB调用WebService
- 背包问题求解总结
- UIView Animation 的参数详解
- STL各种容器迭代器失效的时机
- [iReport总结3] EBS使用jasper report进行报表开发
- GEF常见问题2:具有转折点的连接线
- Struts,Hibernate,Spring经典面试题收藏
- 了解html页面的渲染过程以备学习前端的性能优化
- [技术讨论]网络软件开发的bug分析与公司开发管理问题之阿里篇
- 如何使用SSIS程序包中的事务管理