1、1算法设计与分析实验报告六学号: 1004091130 姓名: 金玉琦 日期: 2011-11-17 得分: 一、实验内容:运用回溯法解决 0-1 背包问题二、所用算法的基本思想及复杂度分析:回溯法回溯法就是一种有组织的系统化搜索技术, 可以看作是蛮力法穷举搜索的改进。回溯法每次只构造可能解的一部分, 然后评估这个部分解, 如果这个部分解有可能导致一个完整解, 则对其进一步构造, 否则, 就不必继续构造这个部分解了。回溯法常常可以避免搜索所有的可能解。0-1背包问题1)基本思想给定 n 种物品和一个容量为 C 的背包, 物品 i 的重量是W i, 其价值为V i , 0/ 1 背包问题是如何选
2、择装入背包的物品(物品不可分割) , 使得装入背包中物品的总价值最大,设计可能解的表示方式, 构成解空间树。2)复杂度分析时间复杂度是O(2 n);三、源程序及注释:#include using namespace std; class Knap friend int Knapsack(int p,int w,int c,int n ); public: void print() for(int m=1;mn) if(bestpbestp)/搜索右子树 xi=0; Backtrack(i+1); class Object friend int Knapsack(int p,int w,int
3、c,int n); public: int operator=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 Objectn; for(i=1;in; p=new intn+1; w=new intn+1; p0=0; w0=0; coutpi; coutwi; coutc; coutKnapsack(p,w,c,n)endl; 6四、运行输出结果:五、调试和运行程序过程中产生的问题、采取的措施及获得的相关经验教训:0-1背包问题和背包问题不同,0-1背包问题中的物品不可分割。编写程序的时候有困难,在网上找了方法,程序运行时会有计算错误的情况。通过回溯法的学习,我们要学会掌握回溯法的设计思想,掌握解空间树的构造方法, 以及在求解过程中如何存储求解路径。