实验4回溯算法.docx

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验4回溯算法

《算法设计与分析》实验报告实验4 回溯算法姓名 学号 班级 网络131 实验日期 2016.11.14 实验地点 学院305 一、实验目的1、掌握分治算法的设计思想与分析方法;2、掌握归并排序、快速排序等高效排序算法。二、实验环境1、硬件环境CPU:IntelR coreTM i5-3337U内存:4.00GB硬盘:1TB2、软件环境操作系统:win10编程环境:C Free编程语言:C三、实验内容1、问题有一个背包,最大限重为C,有n个物品,重量分别为W=<w1, w2, …, wn>,要求找出一个装载方案,使得放入背包物品的重量最大。输出装载方案和该方案下的背包所装物品总重量。2、数据结构(1)解的结构一维数据(1)<0 1 0 1 1 1 1> (2) <0 0 1 0 1 1 0>(2)搜索空间的结构3、算法伪代码ReBack(i) If i>n then<x1,x2,x3,...xn>是解 Else while Si≠? do Xi<—Si中最小值 Si<—Si-{Xi}5、 计算Si+1 6、 ReBack(i+1) 4、算法分析时间复杂度:O(2n)?空间复杂度:O(n)5、关键代码(含注释)#include <iostream>#include <vector>using namespace std;class PackBackTrack{protected:vector<int> m_p; //N个背包的价格vector<int> m_w; //N个背包的重量intm_c; //背包的容量intm_num; //物品的件数intbestValue;//背包最大价值intcurrentValue;//当前背包中物品的价值intcurrentWeight;//当前背包中物品的重量private://辅助函数,用于回溯搜索void BackTrack(int depth){if(depth >= m_num) //达到最大深度{if(bestValue < currentValue) //保存最优解bestValue = currentValue;return ;}if(currentWeight +m_w[depth] <= m_c) //是否满足约束条件{currentWeight += m_w[depth];currentValue += m_p[depth];//选取了第i件物品BackTrack(depth+1); //递归求解下一个结点//恢复背包的容量和价值currentWeight -= m_w[depth];currentValue -= m_p[depth];}//不取第i件物品BackTrack(depth+1);}public://构造函数PackBackTrack();PackBackTrack(vector<int>& p,vector<int>& w, int c,int n):m_p(p),m_w(w),m_c(c),m_num(n){bestValue =0;currentValue =0;currentWeight =0;}//获取背包内物品的最大值int GetBestValue(){BackTrack(0);return bestValue;}};int main(void){//测试程序int n;int c;cout << "请输入物品的件数" << endl;cin >>n;cout << "请输入背包的容量" << endl;cin >>c;vector<int> w(n);vector<int> p(n);cout << "请输入物品的重量:" << endl;for(int i=0;i<n;++i)cin >> w[i];cout << "请输入物品的价格:" << endl;for(int j=0;j<n;++j)cin >> p[j];PackBackTrack pack(p,w,c,n);int bestValue = pack.GetBestValue();cout << "背包内的物品的最大价值为:" << bestValue << endl;return 0;}6、实验结果(1)输入:C=152,n=7,W=<90, 80, 40, 30, 20, 12, 10>输出:(2)输入:C=945,n=7,W=<2, 23, 163, 241, 311, 479, 487> 输出:四、实验总结(心得体会、需要注意的问题等) 通过这次实验,我对回溯算法有了更深入的了解,同时锻炼了我对C这个工具的应用能力。在学习语言的时候一定要记住动手,不要只说不做,这样会行成眼高手低,不管什么样的程序都要亲手做

文档评论(0)

docindpp + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档