问题描述:
给定n种物品和一背包,物品i的重量是wi,其价值为vi,背包的容量为C。问应如何选择装入背包的物品(物品不能分割),使得装入背包中物品的总价值最大?
抽象描述如下:
x[n]:表示物品的选择,x[i]=1表示选择放进物品i到背包中。
问题分析:
1.抽象之后背包问题转换为找到一个最优的数组,x1,x2,.....,xn的0-1序列。
2.假设最优解的序列为x1,x2,.....,xn,能使背包容量C的总价值最大.
如果,x1=1,则x2,...,xn是C-w1容量的背包的总价值依然是最大的序列;
如果,x1=0,则x2,....,xn是C容量的背包的总价值依然是最大的序列。
这就是我们所说的最优子结构性质。
3.进一步分析:我们用m(i,j)表示为已经判断好了1:i-1的序列的背包最大价值,并且此时的背包剩余的容量为j,对物品i进行判断
如果j>wi, 就只要做出选择wi和不选择wi情况下,哪种更能使背包的总价值更大:m(i,j)=max{ m(i+1,j),m(i+1,j-wi)+vi}(注意这是个递归式)
如果j<wi: m(i,j)=m(i+1,j)
初始化: m(n,j)=vn (j>= wn);
m(n,j)=0 (0<=j< wn)
m(0,C)=0
最终的结果:m(1,C)
4.依次我们就得到了一个递归的表达式:
5.如果单纯的从利用递归,重复计算了很多的值,耗费的时间是很大的,动态规划还需避免这种重复计算,怎样自顶向下或自底向上的计算呢?
采用列表的方法就可以很好的分析设计自顶向下或自底向上的计算的算法了
举例分析:
n=3,c=6,w={4,3,2} v={5,2,1}
m[i][j]=max{ m[i+1][j], m[i+1][j-w[i]]+v[i] }
列表如下:
最左边箭头:我们计算的方向,从第3行开始向上计算法值。
表中红色箭头是我们通过选择做出的结果:列如 m[2][3]=max{m[3][3],m[3][3-w[2]]+v[2]},我们最终选择了m[3][3-w[2]]+v[2]。
整个问题的最优解保存在m[1][6]中。
计算机算法分析考试:动态规划0-1背包问题,怎么算
问题分析: 1.抽象之后背包问题转换为找到一个最优的数组,x1,x2,...,xn的0-1序列。 2.假设最优解的序列为x1,x2,...,xn,能使背包容量C的总价值最大. 如果,x1=1,则x2,...,xn是C-w1容量的背包的总价值依然是最大的序列; 如果,x1=0,则x2,...,xn是C容量的...
0-1背包问题的动态规划算法
0-1背包问题的动态规划算法主要解决的问题是如何在有限的容量内选择物品,使得总价值最大。具体来说,给定一组物品,每种物品有其重量和价值,总重量有限,选择哪些物品才能获得最大价值。此问题属于NP问题,贪婪算法无法保证最优解。定义子问题为在前i个物品中,选择总重量不超过j的物品,使得总价值最...
【学界】0-1背包问题的动态规划算法
动态规划算法提供了一种高效求解0-1背包问题的方法。通过定义子问题(即在前i个物品中选择不超过W重量的物品,使得价值最大),并利用递推关系(选择第i个物品或不选择),可以构建一个二维表来存储所有可能的最优解。算法的复杂度是O(nW),其中n是物品数量,W是总重量限制。利用动态规划,可以有效...
动态规划浅析——0-1背包问题
[公式]简单来说,就是寻找一个物品组合,使它们的总重量不超过最大容量,同时总价值达到最大。动态规划是一种运筹学方法,用于解决那些决策阶段之间相互关联且需要找出整体最优解的问题。它适用于无后效性问题,即后续决策不受前期决策影响,只依赖当前状态和未来的决策。0-1背包问题中的决策满足这种无...
0-1背包问题的多种解法代码(动态规划、贪心法、回溯法、分支限界法)
\/* (2) xi∈{0, 1}, 1<=i<=n \/* \/* 2. 0-1背包问题的求解 \/* 0-1背包问题具有最优子结构性质和子问题重叠性质,适于 \/* 采用动态规划方法求解 \/* \/* 2.1 最优子结构性质 \/* 设(y1,y2,...,yn)是给定0-1背包问题的一个最优解,则必有 \/* 结论,(y2,y3,...,yn)是如下子问题的一...
用动态规划算法怎样求解01背包问题
动态规划主要解决的是多阶段的决策问题。01背包中,状态为背包剩余的容量,阶段是每一个物品,决策是是否选择当前的物品。所以用动态规划来解决是非常贴切的。我们设f[V]表示已经使用容量为V时所能获得的最大价值,w[i]表示i物品的质量,c[i]表示i物品的价值。for(int i=1;i<=n;i++) for(...
动态规划的0-1背包问题,请高手解释下代码
简单解释一下吧 在解释之前你要知道动态规划是一个自底向上的过程 这个算法用到了一个二维数组m[][] 来存储各个坐标的价值信息 所以横坐标表示背包号码 纵坐标表示背包容量从1到c 注意该算法只能限制c是整数且每个背包的重量也是整数.然后int jMax=min(w[n]-1,c);找出w[n]-1和 c之间的小者。
动态规划中的0-1背包问题怎么去理解?要求给出具体实例和详细步骤...
试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和 上界函数等必要的函数,并将此函数用于解0-1背包问题。0-1 背包问题描述如下:给定n 种物品和一个背包。物品i 的重量是 wi ,其价值为 vi ,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最...
动态规划中的0-1背包问题怎么去理解?要求给出具体实例和详细步骤...
从背包容量为0开始,1号物品先试,0,1,2,的容量都不能放.所以置0,背包容量为3则里面放4.这样,这一排背包容量为4,5,6,...10的时候,最佳方案都是放4.假如1号物品放入背包.则再看2号物品.当背包容量为3的时候,最佳方案还是上一排的最价方案c为4.而背包容量为5的时候,则最佳方案为自己的...
0-1背包问题入门详解
0-1背包问题说的是,给定背包容量W,一系列物品{weiht,value},每个物品只能取一件,获取最大值。采用动态规划求解,动态规划的一般规律都是,在什么什么前i个状态下的最大值或者最小值的前提下,然后再把i的状态的值求出来。这里我们定义一个函数,表示状态。m(1,2,3,4..i)(w)表示有1号,2...