教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 政务民生 >

分支限界法-01背包问题

来源:网络收集 时间:2026-06-05
导读: 用分支限界法解决0-1背包问题 #includeiostream #includestack #define N 200 using namespace std; class HeapNode { public: double uprofit,profit,weight; int level,x[N]; }; stackHeapNode H; double w[N],p[N]; double cw,cp,c; int n; double Bound(

用分支限界法解决0-1背包问题

#include<iostream>
#include<stack>
#define N 200
using namespace std;
class HeapNode
{
public:
double uprofit,profit,weight;
int level,x[N];
};

stack<HeapNode> 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)
{cout<<"down: "<<bestp<<endl<<"up: "<<up<<endl;
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]"<<endl;
for(int i=1;i<=n;i++) cin>>w[i];

cout<<"请输
入p[i]"<<endl;
for(int i=1;i<=n;i++) cin>>p[i];

cout<<"最优值是:"<<Knap()<<endl;
return 0;
}

分支限界法-01背包问题.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/1444936.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)