算法实验之贪心策略求解背包问题

这篇博客介绍了背包问题,包括0-1背包和背包问题,并探讨了贪心算法在解决背包问题上的应用。文章详细分析了贪心策略,如价值最大、重量最小和价值密度等,并指出这些策略在某些情况下可能无法得到最优解。同时,对比了动态规划法的优势。文中还给出了贪心算法的计算模型和C++源代码实现,并通过实例验证了算法的有效性。
摘要由CSDN通过智能技术生成

1 问题描述

0-1背包问题:给定n种物品和一个背包。物品i的重量是,其价值为,背包的容量为W。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包(1)或不装入背包(0)。不能将物品i装入背包多次,也不能只装入部分的物品i。

 

背包问题:给定n种物品和一个背包。物品i的重量是,其价值为,背包的容量为W。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。

2 问题的相关背景描述

背包问题(Knapsack problem)是一种组合优化的NP完全问题。问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。问题的名称来源于如何选择最合适的物品放置于给定背包中。相似问题经常出现在商业、组合数学,计算复杂性理论、密码学和应用数学等领域中。也可以将背包问题描述为决定性问题,即在总重量不超过W的前提下,总价值是否能达到V?它是在1978年由Merkel和Hellman提出的。

背包问题可以用贪心算法求解,除此之外还可以用动态规划求解,但是对于0-1背包问题还是由动态规划求解。对于0-1背包问题,贪心算法之所以不能得到最优解是因为在这种情况下,它无法保证最后能将背包装满,部分闲置的背包空间,使每公斤背包的价值降低了

 

参考文献:百度百科“背包问题”  http://baike.baidu.com

 

3.问题分析

贪心算法基本过程:

1.    建立数学模型来描述问题;

2.    把求解的问题分成若干个子问题;

3.    对每一子问题求解,得到子问题的局部最优解;

4.    把子问题的解局部最优解合成原来解问题的一个解。

 

贪心算法解决背包问题的几种策略: 

(i) 第一种贪婪准则为:从剩余的物品中,选出可以装入背包的价值最大的物品,利用这种规则,价值最大的物品首先被装入(假设有足够容量),然后是下一个价值最大的物品,如此继续下去。这种策略不能保证得到最优解。

(ii) 第二种方案是重量贪婪准则:从剩下的物品中选择可装入背包的重量最小的物品。虽然这种规则对于前面的例子能产生最优解,但在一般情况下则不一定能得到最优解。考虑n= 2 ,w=[10,20], p=[5,100], c= 25。当利用重量贪婪策略时,获得的解为x =[1,0], 比最优解[ 0 , 1 ]要差。 

(iii) 第三种贪婪准则,每一项计算=/,即该项值和大小的比,再按比值的降序来排序,从第一项开始装背包,然后是第二项,依次类推,尽可能的多放,直到装满背包。 

有的参考资料也称为价值密度/贪婪算法。这种策略也不能保证得到最优解。虽然按/非递(增)减的次序装入物品不能保证得到最优解,但它是一个直觉上近似的解。 

而且这是解决普通背包问题的最优解,因为在选择物品i装入背包时,可以选择物品i的一部分,而不一定要全部装入背包,1≤i≤n。

 

对比动态规划法:

动态规划法可以解决贪心策略无法解决的0-1背包问题。

用V[i][j]表示前i个物品在总体积不超过j的情况下,放到背包里的最大价值。

状态转移方程:

V[0][j] = 0;

V[i][j] =

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值