回溯法解背包问题实验报告精编WORD版
- 格式:docx
- 大小:22.07 KB
- 文档页数:11
《算法分析与设计》实验报告2015-2016年第2学期实验班级:学生姓名:学号:指导老师:信息工程学院实验项目名称:回溯算法解决0-1背包问题实验日期:2016年5 月18 日一、实验类型:□√验证性□设计性二、实验目的掌握0—1背包问题的回溯算法三、实验内容及要求给定n种物品和一背包。
物品i的重量是wi,其价值为vi,背包的容量为C。
问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?四、实验步骤#include<iostream>using namespace std;class Knap{ friend int Knapsack(int p[],int w[],int c,int n );public:void print(){for(int m=1;m<=n;m++){ cout<<bestx[m]<<" ";}cout<<endl;};private:int Bound(int i);void Backtrack(int i);int c;//背包容量int n; //物品数int *w;//物品重量数组int *p;//物品价值数组int cw;//当前重量int cp;//当前价值int bestp;//当前最优值int *bestx;//当前最优解int *x;//当前解};int Knap::Bound(int i){//计算上界int cleft=c-cw;//剩余容量int b=cp;//以物品单位重量价值递减序装入物品while(i<=n&&w[i]<=cleft){cleft-=w[i];b+=p[i];i++;}//装满背包if(i<=n)b+=p[i]/w[i]*cleft;return b;}void Knap::Backtrack(int i){if(i>n){if(bestp<cp){ for(int j=1;j<=n;j++)bestx[j]=x[j];bestp=cp;}return;}if(cw+w[i]<=c) //搜索左子树{ x[i]=1;cw+=w[i];cp+=p[i];Backtrack(i+1);cw-=w[i];cp-=p[i];}if(Bound(i+1)>bestp)//搜索右子树{ x[i]=0;Backtrack(i+1);}}class Object{friend int Knapsack(int p[],int w[],int c,int n); public:int operator<=(Object a)const{ return (d>=a.d);}private:int ID;float d;};int Knapsack(int p[],int w[],int c,int n){ //为Knap::Backtrack初始化int W=0;int P=0;int i=1;Object *Q=new Object[n]; for(i=1;i<=n;i++){ Q[i-1].ID=i;Q[i-1].d=1.0*p[i]/w[i];P+=p[i];W+=w[i];}if(W<=c)return P;//装入所有物品//依物品单位重量排序float f;for( i=0;i<n;i++)for(int j=i;j<n;j++){if(Q[i].d<Q[j].d){f=Q[i].d;Q[i].d=Q[j].d;Q[j].d=f;}}Knap K;K.p = new int[n+1];K.w = new int[n+1];K.x = new int[n+1];K.bestx = new int[n+1];K.x[0]=0;K.bestx[0]=0;for( i=1;i<=n;i++){ K.p[i]=p[Q[i-1].ID];K.w[i]=w[Q[i-1].ID];}K.cp=0;K.cw=0;K.c=c;K.n=n;K.bestp=0;//回溯搜索K.Backtrack(1);K.print();delete [] Q;delete [] K.w;delete [] K.p;return K.bestp;}void main(){int *p;int *w; int c=0;int n=0;int i=0; cout<<"请输入背包个数:"<<endl; cin>>n;p=new int[n+1];w=new int[n+1];p[0]=0;w[0]=0;cout<<"请输入各背包的价值:"<<endl; for(i=1;i<=n;i++)cin>>p[i];cout<<"请输入各背包的重量:"<<endl; for(i=1;i<=n;i++)cin>>w[i];cout<<"请输入背包容量:"<<endl; cin>>c;cout<<Knapsack(p,w,c,n)<<endl;}五、实验结果1、实验图形2、结果分析输入背包个数为4个,背包价值分别为30 25 26 15,背包重量分别为4 2 3 1,背包的容量分别为1 2 3 4,则得出的背包算法为0 0 0 1,最优值为15。
《算法设计与分析》实验报告学号:姓名:日期:得分:一、实验内容:用回溯法求解0/1背包问题注:给定n种物品和一个容量为C的背包,物品i的重量是w,其价值为iv,背包问题是如何使选择装入背包内的物品,使得装入背包中的物品的总i价值最大。
其中,每种物品只有全部装入背包或不装入背包两种选择。
二、所用算法的基本思想及复杂度分析:1.回溯法求解背包问题:1)基本思想:回溯法:为了避免生成那些不可能产生最佳解的问题状态,要不断地利用限界函数(bounding function)来处死那些实际上不可能产生所需解的活结点,以减少问题的计算量。
这种具有限界函数的深度优先生成法称为回溯法。
对于有n种可选物品的0/1背包问题,其解空间由长度为n的0-1向量组成,可用子集数表示。
在搜索解空间树时,只要其左儿子结点是一个可行结点,搜索就进入左子树。
当右子树中有可能包含最优解时就进入右子树搜索。
2)复杂度分析:回溯法求解0/1背包问题的时间复杂度为:)2()(n O n T =。
空间复杂度:有n 个物品,即最多递归n 层,存储物品信息就是一个一维数组,即回溯法求解0/1背包问题的空间复杂度为)(n O 。
2.以动态规划法验证:1)基本思想:令),(j i V 表示在前)1(n i i ≤≤个物品中能够装入容量为)1(C j j ≤≤的背包中的物品的最大值,则可以得到如下动态函数:0),0()0,(==j V i V{}⎩⎨⎧≥+---<-=)(),1(),,1(max ))(,1(),(i i i i w j v w j i V j i V w j j i V j i V 按照下述方法来划分阶段:第一阶段,只装入前1个物品,确定在各种情况下的背包能够得到的最大价值;第二阶段,只装入前2个物品,确定在各种情况下的背包能够得到的最大价值;以此类推,直到第n 个阶段。
最后,),(C n V 便是在容量为C 的背包中装入n 个物品时取得的最大价值。
实验报告. 基于回溯法的0-1背包等问题实验内容本实验要求基于算法设计与分析的一般过程(即待求解问题的描述、算法设计、算法描述、算法正确性证明、算法分析、算法实现与测试),通过回溯法的在实际问题求解实践中,加深理解其基本原理和思想以及求解步骤。
求解的问题为0-1背包。
作为挑战:可以考虑回溯法在如最大团、旅行商、图的m着色等问题中的应用。
实验目的◆理解回溯法的核心思想以及求解过程(确定解的形式及解空间组织,分析出搜索过程中的剪枝函数即约束函数与限界函数);◆掌握对几种解空间树(子集树、排列数、满m叉树)的回溯方法;◆从算法分析与设计的角度,对0-1背包等问题的基于回溯法求解有进一步的理解。
环境要求对于环境没有特别要求。
对于算法实现,可以自由选择C, C++或Java,甚至于其他程序设计语言如Python等。
实验步骤步骤1:理解问题,给出问题的描述。
步骤2:算法设计,包括策略与数据结构的选择。
步骤3:描述算法。
希望采用源代码以外的形式,如伪代码或流程图等;步骤4:算法的正确性证明。
需要这个环节,在理解的基础上对算法的正确性给予证明;步骤5:算法复杂性分析,包括时间复杂性和空间复杂性;步骤6:算法实现与测试。
附上代码或以附件的形式提交,同时贴上算法运行结果截图;步骤7:技术上、分析过程中等各种心得体会与备忘,需要言之有物。
说明:步骤1-6在“实验结果”一节中描述,步骤7在“实验总结”一节中描述。
实验结果步骤1:问题描述。
给定 n个物品,其中第 i 个物品的重量为w i ,价值为 v i 。
有一容积为 W 的背包,要求选择一些物品放入背包,使得物品总体积不超过W的前提下,物品的价值总和最大。
0-1背包问题的限制是,每种物品只有一个,它的状态只有放和不放两种。
0-1背包问题是特殊的整数规划问题,其可用数学语言表述为:对于给定 n >0,W >0,v,w (v i ,w i >0,1≤i ≤n),找出一个 n 元0-1向量x =( x 1, x 2,⋯, x n ) 其中x i ∈{0,1},1≤i ≤n ,使得∑v i n i=1x i 最大,并且∑w i n i=1x i ≤W ,即:max x (∑v i ni=1x i ) s.t.∑w i ni=1x i ≤W, x i ∈{0,1},1≤i ≤n步骤2:算法设计,即算法策略与数据结构的选择。
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==背包问题实验报告篇一:背包问题实验报告课程名称:任课教师:班级:201X姓名:实验报告算法设计与分析实验名称:解0-1背包问题王锦彪专业:计算机应用技术学号:11201X 严焱心完成日期: 201X年11月一、实验目的:掌握动态规划、贪心算法、回溯法、分支限界法的原理,并能够按其原理编程实现解决0-1背包问题,以加深对上述方法的理解。
二、实验内容及要求:1.要求分别用动态规划、贪心算法、回溯法和分支限界法求解0-1背包问题;2.要求显示结果。
三、实验环境和工具:操作系统:Windows7 开发工具:Eclipse3.7.1 jdk6 开发语言:Java四、实验问题描述:0/1背包问题:现有n种物品,对1<=i<=n,第i种物品的重量为正整数Wi,价值为正整数Vi,背包能承受的最大载重量为正整数C,现要求找出这n种物品的一个子集,使得子集中物品的总重量不超过C且总价值尽量大。
动态规划算法描述:根据问题描述,可以将其转化为如下的约束条件和目标函数:nmax?vixi?n??wixi?C?i?1?x?{0,1}(1?i?n)?i寻找一个满足约束条件,并使目标函数式达到最大的解向量nX?(x1,x2,x3,......,xn)wixi,使得?i?1?C,而且?vixii?1n达到最大。
0-1背包问题具有最优子结构性质。
假设(x1,x2,x3,......,xn)是所给的问题的一个最优解,则(x2,x3,......,xn)是下面问题的一个最优解:?n??wixi?C?w1x1max?i?2?x?{0,1}(2?i?n)?i如果不是的话,设(y?vixi。
i?2nn2,y3,......,yn)是这个问题的一个最优解,则?viyi??vixi,且w1x1 i?2i?2n??wiyii?2?C。
背包问题实验报告1. 引言背包问题是一类经典的组合优化问题,在现实生活中有着广泛的应用。
背包问题可以描述为:有一个背包容量为W的背包和N个物品,每个物品有一定的重量和价值,要求将物品放入背包中使得背包的总价值最大。
本实验旨在通过比较不同的算法策略,找到解决背包问题的最佳方法,以提高背包问题的求解效率。
2. 实验环境•操作系统:Windows 10•编程语言:Python 3.8•开发环境:Visual Studio Code3. 实验过程3.1 暴力穷举法暴力穷举法是解决背包问题的一种基本策略。
该方法通过遍历所有可能的组合,计算每个组合的价值,并找到最大价值的组合作为最优解。
具体步骤如下:1.初始化最大价值max_value为0,最优解combo为空集。
2.遍历所有可能的物品组合:–将组合中的物品放入背包中,计算背包中物品的总价值。
–若背包总价值超过max_value,则更新max_value和combo。
3.输出最优解combo和最大价值max_value。
该方法的时间复杂度为O(2^N),其中N为物品的数量,在物品数量较大时效率较低。
3.2 动态规划法动态规划法是解决背包问题的一种高效策略。
该方法通过构建价值表,利用子问题的最优解来求解背包问题的最优解。
具体步骤如下:1.初始化一个二维数组value_table,其中value_table[i][j]表示前i个物品放入容量为j的背包中的最大价值。
2.根据以下递推关系来填充value_table的值:–若第i个物品的重量大于背包容量j,则value_table[i][j]等于value_table[i-1][j],表示第i个物品不能放入背包中。
–若第i个物品的重量小于等于背包容量j,则value_table[i][j]等于max(value_table[i-1][j], value_table[i-1][j-w[i]]+v[i]),表示第i个物品可以选取并放入背包中,或不选取第i个物品。
一、实验目的1. 理解回溯法的基本原理和适用场景。
2. 掌握回溯法在解决实际问题中的应用。
3. 通过实验,提高编程能力和算法设计能力。
二、实验背景回溯法是一种在计算机科学中广泛应用的算法设计方法。
它通过尝试所有可能的解,在满足约束条件的前提下,逐步排除不满足条件的解,从而找到问题的最优解。
回溯法适用于解决组合优化问题,如0-1背包问题、迷宫问题、图的着色问题等。
三、实验内容本次实验以0-1背包问题为例,采用回溯法进行求解。
1. 实验环境:Windows操作系统,Python 3.7以上版本。
2. 实验工具:Python编程语言。
3. 实验步骤:(1)定义背包容量和物品重量、价值列表。
(2)定义回溯法函数,用于遍历所有可能的解。
(3)在回溯法函数中,判断当前解是否满足背包容量约束。
(4)若满足约束,则计算当前解的价值,并更新最大价值。
(5)若不满足约束,则回溯至前一步,尝试下一个解。
(6)输出最优解及其价值。
四、实验结果与分析1. 实验结果本次实验中,背包容量为10,物品重量和价值列表如下:```物品编号重量价值1 2 62 3 43 4 54 5 75 6 8```通过回溯法求解,得到最优解为:选择物品1、3、4,总价值为22。
2. 实验分析(1)回溯法能够有效地解决0-1背包问题,通过遍历所有可能的解,找到最优解。
(2)实验结果表明,回溯法在解决组合优化问题时具有较高的效率。
(3)在实验过程中,需要合理设计回溯法函数,以提高算法的效率。
五、实验总结通过本次实验,我们了解了回溯法的基本原理和适用场景,掌握了回溯法在解决实际问题中的应用。
在实验过程中,我们提高了编程能力和算法设计能力,为今后解决类似问题奠定了基础。
在今后的学习和工作中,我们将继续深入研究回溯法及其应用,以期为解决实际问题提供更多思路和方法。
#include<stdio.h> int c; // 背包含量int n; // 物件数int weight[100]; // 寄存 n 个物件重量的数组int price[100]; // 寄存 n 个物件价值的数组int currentWeight=0; // 目前重量int currentPrice=0; // 目前价值int bestPrice=0; // 目前最优值int bestAnswer[100]; // 目前最优解int bp=0;int bA[100]; // 目前最优解int times=0;void Print();void Backtracking(int i){times+=1;if(i>n){Print();if(bestPrice>bp){bp=bestPrice;for(int j=1;j<=n;j++)bA[j]=bestAnswer[j];}return;}if(currentWeight+weight[i]<=c){ // 将物件 i 放入背包,搜寻左子树bestAnswer[i] = 1;currentWeight += weight[i];bestPrice += price[i];Backtracking(i+1); //达成上边的递归,返回到上一结点,物件i 不放入背包,准备递归右子树currentWeight -= weight[i];bestPrice -= price[i];}bestAnswer[i] = 0;Backtracking(i+1);}void Print(){int i;printf("\n 路径为 {");for(i=1;i<n;++i)printf("%d,",bestAnswer[i]);printf("%d}\t 价值为 %d\n",bestAnswer[i],bestPrice); }void main(){int i;/* 输入部分 */printf(" 请输入物件的数目 :\n");scanf("%d",&n);printf(" 请输入背包的容量 (能蒙受的重量 ):\n"); scanf("%d",&c);printf(" 请挨次输入 %d 个物件的重量 :\n",n);for(i=1;i<=n;i++)scanf("%d",&weight[i]);printf(" 请挨次输入 %d 个物件的价值 :\n",n);for(i=1;i<=n;i++)scanf("%d",&price[i]);printf(" 各切合条件的路径为: \n");Backtracking(1);printf("*******************************************************\n"); printf("\n 最优解路径为 {");for(i=1;i<n;++i)printf("%d,",bA[i]);printf("%d}\t 总价值为 %d\n",bA[i],bp);printf("\n\n总合搜寻结点数%d\n",times);}。
算法设计与分析实验报告书实验名称:0/1背包问题学号:姓名:实验时间:2015年 6 月 1 日一实验目的和要求(1)深刻掌握贪心法、动态规划法、回溯法的设计思想并能熟练运用(2)理解这样一个观点:同样的问题可以用不同的方法来解决,一个好的算法是反复努力和重新修正的结果。
二实验内容(1)分别用蛮力法贪心法、动态规划法、回溯法设计0/1背包问题的算法。
(2)分析算法随n和C变化的时间性能,随机产生参数n和C,收集算法执行的时间(3)讨论n和C变化时,动态规划法和回溯法的时间性能。
(4)讨论几种算法在该问题求解上的特点。
三实验环境VC++6.0四设计思想及实验步骤蛮力法的设计思想和步骤将所有排列下的背包的重量和价值都计算出来,选择重量不大于背包的总重量下的最大价值。
贪心法的设计思想和步骤首先计算每种物品单位重量的价值vi/wi;按单位价值对物品进行升序排列。
然后,依贪心选择策略,将尽可能多的单位重量价值最高的物品装入背包,直到背包装满为止。
动态规划法的设计思想和步骤令V(i, j)表示在前i个物品中能够装入容量为j的背包中的物品的最大价值,则可以得到如下动态函数:V(i, j)=0 (i=0或j=0)V( i, j) = V(i-1, j) j<w[i]V( i, j) = max{V(i-1, j), V(I, j-1)+v[i]} j>=w[j]按照下述方法来划分段:第一段只装入前1个物品,确定在各种情况下的背包能够得到的最大价值;第二阶段,只装入2个物品,确定在各种情况下的背包能够得到的最大价值;以此类推,直到第n个阶段。
最后V(n, C)便是容量为C的背包中装入n个物品时获取到的最大价值。
回溯法的设计思想和步骤为了避免生成那些不可能产生最佳解的问题状态,要不断的利用越约束条件来剪掉那些实际上不可能产生所需解的节点,以减少问题额计算量。
对于n种可选物品的0/1背包问题,其解空间长度由长度为n的0-1向量组成,可用子集数表示。
实验目的是使学生消化理论知识,加深对讲授内容的理解,尤其是一些算法的实现及其应用,培养学生独立编程和调试程序的能力,使学生对算法的分析与设计有更深刻的认识。
上机实验一般应包括以下几个步骤:(1)、准备好上机所需的程序。
手编程序应书写整齐,并经人工检查无误后才能上机。
(2)、上机输入和调试自己所编的程序。
一人一组,独立上机调试,上机时出现的问题,最好独立解决。
(3)、上机结束后,整理出实验报告。
实验报告应包括:题目、程序清单、运行结果、对运行情况所作的分析。
实验八 回溯算法——0-1背包问题一、实验目的与要求1. 熟悉0-1背包问题的回溯算法。
2. 掌握回溯算法。
二、实验内容用回溯算法求解下列“0-1背包”问题:给定n 种物品和一个背包。
物品i 的重量是w i ,其价值为v i ,背包的容量为C 。
问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?三、实验步骤1. 理解算法思想和问题要求;2. 编程实现题目要求;3. 上机输入和调试自己所编的程序;4. 验证分析实验结果;5. 整理出实验报告。
实验提示:(1)回溯算法求解0-1背包问题分析回溯法通过系统地搜索一个问题的解空间来得到问题的解。
为了实现回溯,首先需要针对所给问题,定义其解空间。
这个解空间必须至少包含问题的一个解(可能是最优的)。
然后组织解空间。
确定易于搜索的解空间结构。
典型的组织方法是图或树。
一旦定义了解空间的组织方法,即可按照深度优先策略从开始结点出发搜索解空间。
并在搜索过程中利用约束函数在扩展结点处剪去不满足约束的子树,用目标函数剪去得不到最优解的子树,避免无效搜索。
用回溯法解题的步骤:1)针对所给问题定义问题的解空间;2)确定易于搜索的解空间结构;3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效的搜索。
0-1背包问题的数学描述为:n 个物品,物品i 的重量是w i 、其价值为v i ,其中0≤i ≤n-1,背包的容量为C 。
[精品]实验报告回溯法01背包实验目的:掌握回溯法的基本思想和流程,了解01背包问题,并用回溯法求解。
实验原理:回溯法是一种利用搜素树策略求解问题的思想,在问题的求解过程中,采用试错的方法,先从问题的一个可能的解答开始搜素,如果发现在这个答案上已经出现了错误,就返回到上一个状态,尝试其他可能的解答。
回溯法可以看作是深度优先搜素算法的一种特殊情况,它在搜素过程中判断是否满足约束条件,如果不满足,则进行回溯。
01背包问题是指在给定的一组物品中,选取若干个物品放入一个容量为V的背包中,使得背包能够容纳的物品总价值最大。
其中,每个物品只有一个,可以选择放或不放。
实验过程:实验采用C++语言编写程序,首先自定义一个物品结构体,包括物品的编号、重量和价值。
由于只有一组物品,所以可以定义一个全局数组存储物品信息。
然后,定义一个函数backtrack(int i, int cw, int cv),其中i表示当前处理到的物品编号,cw表示当前物品已经放入背包的重量,cv表示当前物品已经放入背包的价值。
函数中,先判断当前物品是否可以放入背包中,如果可以,则更新背包重量和价值,并继续对下一个物品进行搜素;如果不可以,则进行回溯。
回溯时,需要将当前物品从背包中取出,并将已经放入背包的重量和价值还原到回溯前的状态,然后尝试选择其他方案。
程序中,需要定义一个全局变量Maxv存储当前已经求得的最大价值,每次更新最大价值时,也需要将最优解存储下来。
实验结果:经过运行程序,可以得到01背包问题的最优解为45,选取的物品编号为1、3、5。
回溯法是一种基于搜素树策略的算法,适用于求解复杂问题。
在应用回溯法求解问题时,需要注意约束条件的判断和回溯操作的正确性,以及最优解的存储方法。
回溯法解背包问题实验
报告精编W O R D版 IBM system office room 【A0816H-A0912AAAHH-GX8Q8-GNTHHJ8】
实验4回溯法解0-1背包问题一、实验要求
1.要求用回溯法求解0-1背包问题;
2.要求交互输入背包容量,物品重量数组,物品价值数组;
3.要求显示结果。
二、实验仪器和软件平台
仪器:带usb接口微机
软件平台:WIN-XP + VC++6.0
三、实验源码
#include "stdafx.h"
#include<iostream>
#include<cstdio>
#include<conio.h>
#include<iomanip>
using namespace std;
template<class ty>
class Knap
{
public:
friend void Init();
friend void Knapsack();
friend void Backtrack(int i);
friend float Bound(int i);
bool operator<(Knap<ty> a)const {
if(fl<a.fl) return true;
else return false;
}
private:
ty w; //重量
ty v; //价值
float fl; //单位重量的价值v/w
int kk; //记录第几个物品
int flag; //记录是否放入包中
};
template<class ty>
void Sort(Knap<ty> *li,int n)
{
int i,j,k; Knap<ty> minl;
for(i=1;i<n;i++)
{
minl=li[0]; k=0;
for(j=1;j<=n-i;j++)
{
if(minl<li[j])
{
minl=li[j]; swap(li[j],li[k]); k=j;
}
}
}
}
namespace jie //命名空间
{
int c=0,n=0;
int *x=NULL;
Knap<int> *bag=NULL;
int cp=0,cw=0;
int bestp=0;
}
using namespace jie;
void Init()
{
int i=0;
cout<<endl;
cout<<"请输入物品数量 n = ";
cin>>n; cout<<endl;
cout<<"请输入背包容量 C = ";
cin>>c; cout<<endl;
bag=new Knap<int> [n];
x=new int[n];
cout<<"请依次输入"<<n<<"个物品的重量W:"<<endl;
for(i=0;i<n;i++)
cin>>bag[i].w;
cout<<endl;
cout<<"请依次输入"<<n<<"个物品的价值P:"<<endl;
for(i=0;i<n;i++)
cin>>bag[i].v;
for(i=0;i<n;i++)
{
bag[i].flag=0; bag[i].kk=i;
bag[i].fl=1.0*bag[i].v/bag[i].w;
}
}
void Backtrack(int i)
{
if(i>=n) //到达叶节点
{
bestp=cp; //更新最优价值
return;
}
if(cw+bag[i].w<=c) //进入左子树
{
bag[i].flag=1; cw+=bag[i].w; cp+=bag[i].v; Backtrack(i+1);
cw-=bag[i].w; cp-=bag[i].v;
}
if(Bound(i+1)>bestp)//进入右子树
{
bag[i].flag=0; Backtrack(i+1);
}
}
//计算当前节点处的上界
float Bound(int i)
{
int cleft = c-cw; //剩余容量
float b = cp;
while (i<n&&bag[i].w<=cleft)
{
//以物品单位重量价值递减序装入
cleft-=bag[i].w ;
b+=bag[i].v;
i++;
}
//装满背包
if (i<n) b+=1.0*bag[i].v/bag[i].w * cleft;
return b;
}
void Knapsack() //计算最优解和变量值
{
int L(0); //用L累计价值,初始价值设置为0
for(int k=0;k<n;k++)
{
x[bag[k].kk]=bag[k].flag; //x=0表示未放入背包,x=1表示放入背包L+=bag[k].flag*bag[k].v; //价值累加
}
cout<<endl;
cout<<"当前最优价值为:"<<L<<endl;
cout<<"变量值 x = ";
for(int i=1;i<=n;i++)
{
cout<<x[i-1];
}
delete []bag; bag=NULL;
delete []x; x=NULL;
cout<<endl; getch();
}
int main()
{
cout<<endl;
cout<<"|**********回溯法解0-1背包问题**********|"<<endl;
Init();
Backtrack(0);
Knapsack();
return 0;
}
四、运行结果
五、实验小结
通过该实验,我充分了解了回溯法与分支界限法的区别。
回溯法在问题的解空间树中,按深度优先策略,从根结点出发搜索解空间树。
算法搜索至解空间树的任意一点时,先判断该结点是否包含问题的解。
如果肯定不包含,则跳过对该结点为根的子树的搜索,逐层向其祖先结点回溯;否则,进入该子树,继续按深度优先策略搜索。