实验三:分支限界法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

算法设计与分析实验报告三

=∉=+k i U r j i i i i j ,111行最小的两个元素素行不在路径上的最小元

五.实验程序:

#include

#include

#define N 200

using namespace std;

class HeapNode

{

public:

double uprofit,profit,weight; int level,x[N];

};

stack H;

double w[N],p[N];

double cw,cp,c;

int n;

double Bound(int i)

{

double cleft=c-cw,b=cp;

while(i<=n&&w[i]<=cleft)

{

cleft-=w[i];

b+=p[i];

i++;

}

if(i<=n) b+=p[i]/w[i]*cleft;

return b;

}

void AddLiveNode(double up,double cp,double cw,bool ch,int level)

HeapNode nod;

nod.uprofit=up;

nod.profit=cp;

nod.weight=cw;

nod.level=level;

if(level<=n) H.push(nod); }

double Knap()

{

int i=1;

cw=cp=0;

double bestp=0,up=Bound(1); while(1)

{

double wt=cw+w[i];

if(wt<=c)

{

if(cp+p[i]>bestp) bestp=cp+p[i];

AddLiveNode(up,cp+p[i],cw+w[i],true,i+1); }

up=Bound(i+1);

if(up>=bestp)

AddLiveNode(up,cp,cw,false,i+1);

if(H.empty()) return bestp;

HeapNode node=H.top();

H.pop();

cw=node.weight;

cp=node.profit;

up=node.uprofit;

i=node.level;

}

}

int main()

{

cout<<"请输入n和c:"; cin>>n>>c; cout<<"请输入w[i]"<

for(int i=1;i<=n;i++) cin>>w[i];

cout<<"请输入p[i]"<

for(int j=1;j<=n;j++) cin>>p[j];

cout<<"最优值是:"<

}

相关文档
最新文档