背包问题不同解决方法的比较分析:给出穷举法、贪心法、动态规划法、回溯、分支限界法的实现,分析特点,比较效率。
1.穷举法分析
格式:
输入要求:
第一行:物品种类数n 背包容量c
第二行:可装入物品的重量 m1 m2 m3 ... mn
第三行:可装入物品的价值 w1 w2 w3 ... wn
输出要求:
第一行:背包的最大价值
示例:
输入:
5 17
3 4 5 10 8
5 6 10 30 17
输出:
41
代码:
结果:
分析:该算法的时间复杂度是2^n,算法的效率不高。但穷举算法是一种比较通用的算法,通常在找不到最佳的算法时,采用该算法。
2.贪心法分析
格式:
输入:物品数量n,背包容量M,重量与价值数组w、p
输出:解向量x,最优值opt
示例:
输入:
第一行:5 17
第二行:3 4 5 10 8
第三行:5 6 10 30 17
输出:
44.875
核心算法:
将w、p按单位价值非增序排序;
x[1..n]=0;cu=M; opt=0; i=1;
while (i<=n && w[i]<=cu)
{ x[i]=1;cu-=w[i];opt+=p[i]; i++}
if (i<=n) then {x[i]=cu/w[i]; opt+=x[i]*p[i]; }
分析:
贪心法的性质:
指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到。一个问题具有该性质时可用贪心法解决。但是要确定问题是否具有该性质,必须证明每一步贪心选择最终导致问题的整体最优解。