回溯法解装载问题

原创 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;
}

回溯法解最优装载问题

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

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

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

装载问题(回溯)

算法设计例题:装载问题(回溯、分枝限界) memory limit: 5000KB    time limit: 500MS accept: 34    submit: 82 Descripti...

回溯法解最优装载问题

算法设计例题:装载问题(回溯、分枝限界) memory limit: 5000KB    time limit: 500MS accept: 12    submit: 29 Description ...
  • laohan_
  • laohan_
  • 2012年12月16日 10:14
  • 3454

装载问题.回溯法

  • 2008年04月04日 07:47
  • 966B
  • 下载

用回溯算法解装载问题,Java实现

用回溯算法解装载问题,Java实现package n20_装载问题回溯算法; 可以先求出最优值,然后再次执行和求最优值差不多的函数去求最优解。这样总的执行时间反而得到优化。参考书籍:《计算法算法设计与...

回溯法装载问题c++

  • 2010年12月26日 19:48
  • 1KB
  • 下载

最优装载问题——回溯法

  • 2009年10月14日 12:29
  • 3KB
  • 下载

Java语言描述:回溯法之最优装载问题

问题描述: 有一批共有 n 个集装箱要装上两艘载重量分别为 c1 和 c2 的轮船,其中集装箱 i 的重量为 w[i], 且重量之和小于(c1 + c2)。装载问题要求确定是否存在一个合理的装载方案可...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:回溯法解装载问题
举报原因:
原因补充:

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