01背包问题描述:一个旅行者有一个最多能用M公斤的背包,现在有N件物品,
它们的重量分别是W1,W2,...,Wn,
它们的价值分别为P1,P2,...,Pn.
若每种物品只有一件求旅行者能获得最大总价值。
方式一:遍历M*N的数组,对应下图包的总容量M=20,物品种类数N=5
代码如下:
const int nRes=5;//5种物品
int nResWeight[nRes+1]={0,5,3,4,7,8};//每种物品对应重量
int nResValue[nRes+1]={0,14,6,9,18,20};//每种物品对应价值
const int nTotleW=20;//背包容量为20
int nValueTable[nRes+1][nTotleW+1]={0};//动态价值表,每一项对应包当前所能装入的最优值
int KitBag()
{
for(int i=1;i<=nRes;i++)
for(int j=1;j<=nTotleW;j++)//包容量逐渐递增
{
if(j>=nResWeight[i]) //当包容量大于等于当前物品重时
{//如果装入当前物品所能达最大价值>不装当前物品,包选装前面物品所能获得的最大价值
//装入当前物品所能达最大价值=当前物品价值+当前包容量j扣除当前物品重量后,剩余的容量所能装入的最大价值。
//对照上表,当遍历到i=2,j=8时,nValueTable[i-1][j-nResWeight[i]]=nValueTable[1][5]=14,满足条件就装入物品。
if(nResValue[i]+nValueTable[i-1][j-nResWeight[i]]>nValueTable[i-1][j])
nValueTable[i][j]=nResValue[i]+nValueTable[i-1][j-nResWeight[i]];//当前物品装入包.
else//当前物品不装入包,当前包容量下的最大价值仍然是原来的价值
nValueTable[i][j]=nValueTable[i-1][j];
}
else//包容量不足以装入当前物品时,沿用原来的包容量最大价值
nValueTable[i][j]=nValueTable[i-1][j];
}
cout<<"最大值为:"<<nValueTable[nRes][nTotleW];
return nValueTable[nRes][nTotleW];
};
方式二:采用递归方式,遍历二叉树,并通过映射表来剪枝。
代码如下:
int RecursionBag(int nR,int nW)//传入资源数,包容量
{
if(nR==0||nW==0){
return 0;
}
if(nValueTable[nR][nW]!=0){
//当前节点是已访问过的节点,直接返回存储的最优值
return nValueTable[nR][nW];
}
if(nW>=nResWeight[nR])//包容量大于等于当前物品重
{//获得物品放入和不放入两种情况中的价值最大者
nValueTable[nR][nW]=max(nResValue[nR]+RecursionBag(nR-1,nW-nResWeight[nR]),//物品入包后的价值
RecursionBag(nR-1,nW));//物品不入包的最大价值
}
else//包容量不足以放入当前物品
nValueTable[nR][nW]=RecursionBag(nR-1,nW);
return nValueTable[nR][nW];
}
对比两种方式可知,第二种方式遍历的数据量为黄色标注结点,要小于第一种方式的数据访问量。
不过当节点深度上千后,如果包容量远小2^n,比如为 10000,这时前一种方法要快得多。估计这时,递归对访问过的节点虽然不再访问它的子节点,但是这样重复访问到的父节点数量过于庞大。
相关推荐
01背包问题 图解+详细解析(2022.02.10).pdf
0-1背包问题解.rar,包含动态规划法、贪心算法、回溯法、分支界限法。代码含注释,易懂。
01背包问题属于组合优化问题的一个例子,求解01背包问题的过程可以被视作在很多可行解当中求解一个最优解。01背包问题的一般描述如下: 给定n个物品和一个背包,物品i的重量为Wi,其价值为Vi,背包的容量为C。选择...
贪婪法解决01背包问题贪婪法解决01背包问题贪婪法解决01背包问题贪婪法解决01背包问题
背包之01背包、完全背包、多重背包详解.
回溯法解决01背包问题c语言.rar 已调通
01背包问题的源代码,C语言编写,绝对可以运行。
简写01背包,用代码实现01背包的具体例子,比较容易理解
01背包问题是一个很经典的问题,在这里我用回溯法解决。希望大家一起来探讨呀!
分支限界法求01背包问题的解.rar c语言 已调通
C++动态规划实现01背包算法入门通过二维表的方式实现01背包的选取问题
算法设计与分析实验1: 用C语言,采用遗传算法来求解01背包问题。报告及其源代码(源代码附在报告最后面。)
课程作业,实现算法实践书后的例题,实现01背包问题
01背包问题详解,附带源码01背包问题详解,附带源码01背包问题详解,附带源码01背包问题详解,附带源码01背包问题详解,附带源码01背包问题详解,附带源码01背包问题详解,附带源码01背包问题详解,附带源码01背包问题详解,...
分治法求01背包问题c语言 已调通
利用动态规划算法实现了01背包问题,并取得了良好的效果。
01背包问题的贪心算法,详细解析,令你很快懂的01背包问题中的贪心算法思想
动态规划01背包
给定n个物品和一个背包,物品i的重量为Wi,其价值为Vi,背包的容量为C。选择合适的物品装入背包,使得背包中装入的物品的总价值最大。注意的一点是,背包内的物品的重量之和不能大于背包的容量C。在选择装入背包的...
C语言写的01背包问题和部分背包问题的算法设计文档,内容详实