回溯法解装载问题

原创 2013年12月06日 10:38:12

王晓东老师算法设计与分析书当中关于回溯一章有一个实例是装载问题。在研究此算法的过程中也试着实现了一下此问题,当用某种特定类型的时候实现是没有问题的,但是一旦使用了类模板就会出错,提示说不能访问类中的私有变量。自己也完全抄过书中的代码,一样提示出错。很不解。

专门搜索了一下模板与友元,终于找到了答案,原来在类模板中声明模板函数为友元函数在C++ primer当中有专门一节的讲解。读完后,更改代码正确运行。不懂的读者也可以去读一读。关键的一点:

template<class T>void p(void);

template<class T>

class t

{

friend void p<T>(void);

};

template<class T>

void p(void){}


上述代码中,类T是模板类,函数P是模板函数,如果要把p声明为类t的友元,则必须在类之前声明函数原型,并且在类当中一定要声明这是一个模板函数。


回溯问题的代码:

#include<iostream>
using namespace std;

template<class Type>
Type MaxLoading(Type w[],Type c,int n);


template<class Type>
class loading
{


friend Type MaxLoading<Type>(Type w[], Type c,int n);
private:
Type result;
Type bestw;


int n;
int c;
Type *w;
void Backtrack(int i);
};


template<class Type>
void loading<Type>::Backtrack(int i)
{
if(i>n)
{
if(result>bestw)
bestw=result;
return;
}

if(result+w[i] <=c)
{
result+=w[i];
Backtrack(i+1);
result-=w[i];
}

Backtrack(i+1);
}


template<class Type>
Type MaxLoading(Type w[],Type c,int n)
{
loading<Type> l;
l.result=0;
l.bestw=0;


l.n=n;
l.c=c;
l.w=w;
l.Backtrack(1);
return l.bestw;
}

int main()
{
int a[6]={0,3,4,2,6,10};
int c=10;
int bb=MaxLoading<int>(a,c,5);
cout<<bb;
system("pause");
return 0;
}

装载问题——搜索回溯算法

装载问题c++
  • zyg0121
  • zyg0121
  • 2016年08月10日 17:26
  • 309

回溯算法--装载问题

回溯法 1、有许多问题,当需要找出它的解集或者要求回答什么解是满足某些约束条件的最佳解时,往往要使用回溯法。 2、回溯法的基本做法是搜索,或是一种组织得井井有条的,能避免不必要搜索的穷举式搜索法。...
  • sinat_24436879
  • sinat_24436879
  • 2015年04月10日 22:05
  • 2788

装载问题-算法(回溯法)

装载问题 有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。 采用回溯法一次从第一个货物到最...
  • zpDreamer
  • zpDreamer
  • 2016年06月08日 14:40
  • 852

【回溯法解决最优装载问题】

最近算法课在讲解回溯法,回溯法是一种利用树结构,遍历全部可能结果,并输出最优解的算法,它能够保证每一种结果都考虑到,不会出现漏掉的情况。 在用回溯法时,重要的一步操作是画出解空间树,之后按照深度优先便...
  • CHN_NASA
  • CHN_NASA
  • 2016年10月31日 08:17
  • 710

回溯法,回溯法解装载问题

一、回溯法有“通用的解题法”之称,可以系统的搜索一个问题的所有解或任一解。它在问题的解空间中按深度优先策略,从根节点出发,搜索解空间树。算法搜索至解空间树的任一节点时,先判断该节点是否包含问题的解,如...
  • alang080912
  • alang080912
  • 2012年03月16日 11:14
  • 1030

回溯法解最优装载问题

//再来学习一下回溯法 //一般解题步骤分为三步 //一:针对所给问题,定义问题的解空间 //二:确定易于搜索的解空间结构(一般为子集树或者排列树) //三:以深度优先的方式搜索解空间,并且在...
  • haolly
  • haolly
  • 2012年11月29日 10:58
  • 2292

第5章 回溯法,装载问题

#include #include #include using namespace std; #define MAX 100 int c1, c2; //两船的载重量 int n; ...
  • code_pang
  • code_pang
  • 2013年04月14日 19:22
  • 912

回溯子集树与排列树——装载问题&旅行售货员问题(算法设计课题)

*对回溯法不是很理解的请移步博客http://blog.csdn.net/sm9sun/article/details/53244484 掌握了回溯法以后,我们给出两种定义: 当所给问题是从n个元...
  • sm9sun
  • sm9sun
  • 2016年11月22日 18:24
  • 773

回溯法:最优装载问题

回溯法对解空间进行深度优先搜索,在一般情况下可用递归方法实现回溯法。 空间树理解: 假设装载的集装箱n=3,则空间树可以表示为上图,就是1表示装入该集装箱,0表示不装入该集装箱,最优装载问题就...
  • qq_19341327
  • qq_19341327
  • 2016年04月10日 19:54
  • 2568

回溯算法之最优装载问题

问题描述:有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且,装载问题要求确定是否有一个合理的装载方案可将这些集装箱装上这2艘轮船。如果有,找出一种装载方案。   ...
  • qq_20751579
  • qq_20751579
  • 2015年06月27日 16:40
  • 1496
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:回溯法解装载问题
举报原因:
原因补充:

(最多只允许输入30个字)