下载此文档

回溯算法 - 背包算法 c.doc


文档分类:IT计算机 | 页数:约11页 举报非法文档有奖
1/11
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/11 下载此文档
文档列表 文档介绍
回溯算法 0-1 背包算法 2009-12-03 10:38:04 阅读 218 评论 0 字号:大中小订阅. 【实验目的】学****掌握回溯算法。【实验内容】用回溯法求解 0—1 背包问题,并输出问题的最优解。 0—1 背包问题描述如下: 给定 n 种物品和一背包。物品 i 的重量是 Wi , 其价值为 Vi, 背包的容量是 c, 问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大。【实验条件】 Microsoft Visual C++ 【需求分析】对于给定 n 种物品和一背包。在容量最大值固定的情况下,要求装入的物品价值最大化。【设计原理】一、回溯法: 回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中, 按照深度优先的策略, 从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时, 总是先判断该结点是否肯定不包含问题的解。如果肯定不包含, 则跳过对以该结点为根的子树的系统搜索, 逐层向其祖先结点回溯。否则, 进入该子树, 继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时, 要回溯到根, 且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时, 只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题。二、算法框架: 1 、问题的解空间:应用回溯法解问题时,首先应明确定义问题的解空间。问题的解空间应到少包含问题的一个(最优)解。 2、回溯法的基本思想: 确定了解空间的组织结构后, 回溯法就从开始结点( 根结点) 出发, 以深度优先的方式搜索整个解空间。这个开始结点就成为一个活结点, 同时也成为当前的扩展结点。在当前的扩展结点处, 搜索向纵深方向移至一个新结点。这个新结点就成为一个新的活结点, 并成为当前扩展结点。如果在当前的扩展结点处不能再向纵深方向移动, 则当前扩展结点就成为死结点。换句话说, 这个结点不再是一个活结点。此时, 应往回移动( 回溯) 至最近的一个活结点处, 并使这个活结点成为当前的扩展结点。回溯法即以这种工作方式递归地在解空间中搜索,直至找到所要求的解或解空间中已没有活结点时为止。运用回溯法解题通常包含以下三个步骤: (1 )针对所给问题,定义问题的解空间; (2 )确定易于搜索的解空间结构; (3 )以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索; 3 、递归回溯:由于回溯法是对解空间的深度优先搜索,因此在一般情况下可用递归函数来实现回溯法。【概要设计】 0—1 背包问题是一个子集选取问题, 适合于用子集树表示 0—1 背包问题的解空间。在搜索解空间树是, 只要其左儿子节点是一个可行结点, 搜索就进入左子树, 在右子树中有可能包含最优解是才进入右子树搜索。否则将右子树剪去。 int c;// 背包容量 int n; // 物品数 int *w;// 物品重量数组 int *p;// 物品价值数组 int cw;// 当前重量 int cp;// 当前价值 int bestp;// 当前最优值 int *bestx;// 当前最优解 int *x;// 当前解 int Knap::Bound(int i)// 计算上界 void Knap::Backtrack(int i)// 回溯 int Knapsack(int p[],int w[],int c,int n) //为 Knap::Backtrack 初始化【详细设计】#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++;

回溯算法 - 背包算法 c 来自淘豆网www.taodocs.com转载请标明出处.

非法内容举报中心
文档信息
  • 页数11
  • 收藏数0 收藏
  • 顶次数0
  • 上传人phl806
  • 文件大小47 KB
  • 时间2017-02-27