0/1 背包问题
有一个容量为weight的背包,现在要从n件物品中选取若干件装入背包中,每件物品i的重量为w[i],
价值为p[i]。定义一种可行的背包装载为:背包中物品的总重不能超过背包的容量,并且一件物品要么全部选取,要么不选取。定义最佳装载是指所装入的物品价值最高,并且是可行的背包装载。
【样例输入】
11 {weight}
4 {n}
2 4 6 7 {w[i]}
6 10 12 13 {p[i]}
【样例输出】
0 1 0 1
23
【问题分析】
设有数组chosen[1..n],若chosen[i]=1,表示物品i被装入了背包中,chosen[i]=0表示物品i不
装入背包中。那么,chosen[0,1,0,1]就是一种可行的背包装载方案,也是一种最佳的装载方案,此时的总价值为23。
【算法分析】
0/1背包问题有好几种贪心策略,每种贪心策略都是采用多步过程来完成背包的装入,在每一步中,
都是利用某种固定的贪心准则来选择将某一件物品装入背包。
一种贪心准则为:从剩余的物品中,选出可以装入背包的价值最大的物品。这种贪心准则不能保证得
到最优解。例如,weight=105,n=3,w=[100,10,10],p=[20,15,15],按照以上这种“价值贪心准则”,获得的解为choice=[1,0,0],这种方案的总价值为20,而最优解为choice=[0,1,1],其总价值为30。
另一种方案是“重量贪心准则”,即从剩下的物品中,选择可以装入背包的重量最小的物品。虽然这种规则对于前面的例子能产生最优解,但在一般情况下,不一定能得到最优解,例如,weight=25,n=2,
w=[10,20],p=[5,100]。获得的解为choice=[1,0],总价值为5,比最优解choice=[0,1]的总价值100要差。
本题还有一种方案,即“单位价值贪心准则”,这种方案是从剩余物品中,选择可装入包的p[i]/w[i]
值最大的物品,这种策略也不能保证得到最优解。例如,weight=30,n=3,w=[20,15,15],p=[40,25,25]。
获得的解为choice=[1,0,0],总价值为40,而最优解为choice=[0,1,1]的总价值为50。
其实,0/1背包问题是一个复杂的NP问题。对于这类问题,也许根本就不存在多项式时间的算法。在
用贪心法解这类问题时,我们还可以结合其他的一些优化策略,如启发式策略等,使解的结果与最优解相差在一定的范围内,也就是,可以得到原问题的近似最优解。另外,在解本题这样的问题时,还可以采用动态规划方法。
转自: http://liuyangxdgs.blog.163.com/blog/static/29137763200851405846156/
相关推荐
贪心算法解背包问题,供读者参考,我想看看有没有动态规划算法的解决办法
然而,贪心算法并不总是能保证找到0-1背包问题的全局最优解。例如,当存在两件物品A和B,A的价值密度高于B,但将A和B一起放入背包可以得到更高的总价值,这时贪心算法会错过这个更好的组合。因此,对于某些特定的...
### 0-1背包问题(贪心算法)C语言源程序解析 #### 一、问题背景及概述 0-1背包问题是一种经典的组合优化问题,在实际应用中有着广泛的应用场景,比如物流分配、资源调度等领域。该问题的核心是:给定一系列物品...
### 贪心算法在非0-1背包问题中的应用 #### 核心知识点解析: **1. 背包问题概述:** 背包问题是一种经典的组合优化问题,通常出现在计算机科学和数学中,特别是在算法设计与分析领域。它主要探讨的是如何在给定...
贪心算法解决0-1背包问题的基本思路是每次选取单位重量价值(价值除以重量)最大的物品放入背包,直到背包无法再装下任何物品为止。这种方法被称为“价值密度优先”策略。然而,这个策略并不总是能保证得到全局最优...
背包问题根据物品是否可以分割成任意比例,可以分为0-1背包问题(物品不可分割)和分数背包问题(物品可分割)。本文讨论的是分数背包问题。 #### 三、代码解析 本程序实现了使用贪心算法解决分数背包问题的功能,...
算法课程的0-1背包问题贪心算法代码,含截图,经测试可用
常见的背包问题有0-1背包问题(每个物品只能选择放或不放)、完全背包问题(每个物品可以无限数量放入背包)以及部分背包问题(每个物品可以放一定数量)。这里我们关注的是部分背包问题,即每个物品可以放入背包的...
### 0-1背包问题与贪心算法:C++实现详解 #### 一、问题背景与定义 在计算机科学与运筹学中,0-1背包问题是一个经典的组合优化问题。该问题描述为:给定一系列物品,每个物品都有一个重量和一个价值,以及一个背包...
用贪心算法解决背包问题,用netbeans做的。百分百下载就可以直接运行。JAVA 源文件。
但对于某些特殊类型的背包问题,如完全背包和0-1背包,贪心算法可以得到正确的结果。 在实际开发中,我们可能会遇到更复杂的情况,例如在SSH(Spring、Struts、Hibernate)框架下开发Web应用,或者涉及Android平台...
0-1背包问题是最基础的形式,其中每个物品要么完全放入背包,要么完全不放。但在部分背包问题中,我们可以选择物品的一部分进行装入,这样增加了问题的复杂性和灵活性。部分背包问题通常用于模拟资源分配、项目选择...
在背包问题中,初始状态就是有一个空包,包的重量固定为W,有N个商品,每个商品的重量为Wi,价值Ci。目标状态就是将n(n)个商品装入包里,包重不超过W,使得包中商品的总重量最大。状态空间就是将商品装入包的所有组合...
对于背包问题,贪心算法适用于完全背包问题,但对于0-1背包问题,贪心算法不一定能得到最优解。 - 在实际应用中,需要根据具体情况选择合适的算法。 - 对于背包问题,动态规划也是一种常用的解决方法,适用于更广泛...
0-1背包问题是贪心算法的经典应用之一,本文将详细介绍贪心算法解决0-1背包问题的思路、代码实现和运行结果分析。 问题描述 ---------- 0-1背包问题是一个经典的组合优化问题,问题描述如下:有编号分别为a、b、c...
背包问题是计算机科学中的一种经典问题,贪心算法是解决背包问题的一种方法,但它不能解决 0-1 背包问题。背包问题可以用贪心算法解决,因为它具有最优子结构性质,而 0-1 背包问题则需要使用动态规划算法来解决。
在给出的代码中,可以看到一个名为 `Knapsack` 的函数,这是实现贪心算法求解0-1背包问题的核心。函数接受五个参数:`v` 是物品的价值数组,`w` 是物品的重量数组,`x` 是物品是否被选中的标志数组,`c` 是背包的...
参考文献:任静敏,潘大志《带权重的贪心萤火虫算法求解0-1背包问题》,用MATLAB实现改进萤火虫算法(WGFA),对基本的萤火虫算法进行改进,加入线性递减惯性权重,用贪心算法修复不可行解,加入变异算子提高全局...
算法设计与分析--0-1背包问题,动态规划和贪心算法, 这只是一个上课的实验报告。
在0-1背包问题中,贪心算法通常按照物品的价值密度(价值除以重量)进行排序,然后依次选择价值密度最高的物品装入背包,直到背包无法再装下任何物品为止。然而,贪心算法并不能保证在所有情况下都能找到0-1背包问题...