最优装载问题或者01背包问题的分支限界法求解


   问题的提出:背包的容量为 c,物品的个数为n,物品的重量依次为w1,w2,......,wn,求背包中的最大容量。

   01背包问题和下面所描述的装载问题解法一致,大家可以认为是同一类问题。有一批共n个集装箱要装入两艘载重重量为C1,C2的轮船,集装箱的重量分别为w1,w2,......,wn,我们知道集装箱是不能拆开分别装入两艘船上的,所以该问题和01背包问题是一类问题,此时我们只需要考虑将第一艘船尽量装满即可,即此时的“背包容量“为C1。采用队列式分支限界法的算法如下

//实现最优装载问题(或者01背包问题),采用的是队列式分支限界法
#include<iostream>
#include<queue>
using namespace std;


//Q为队列,wt为当前扩展结点所对应的载重量,bestw最优载重量,
//i当前层数,n为总层数
void enqueue(queue<int> &Q,int wt,int &bestw,int i,int n)
{
if(i==n)
{
if(wt>bestw) bestw=wt;
}
else
Q.push(wt);//非叶子结点则加入队列中
}
int MaxLoading(int w[],int c,int n)
{
//初始化
queue<int> q;
q.push(-1);
int i=1;
int EW=0,bestw=0;
while(true)
{
if(w[i]+EW<=c) 
enqueue(q,w[i]+EW,bestw,i,n);
enqueue(q,EW,bestw,i,n);
EW=q.front();
q.pop();
if(EW==-1)
{
if(q.empty()) 
return bestw;
q.push(-1);
EW=q.front();
    q.pop();
i++;
}
}
}
void main()
{
   //解空间的层数
cout<<"输入物品的个数(>0)"<<endl;
int n;
   cin>>n;
   //背包的容量
   cout<<"输入背包的容量"<<endl;
   int c;
   cin>>c;
   //物品的重量
   cout<<"依次输入物品的重量"<<endl;
   int w[100];
   for(int i=1;i<=n;i++)
  cin>>w[i];
    int bestw;
bestw=MaxLoading(w,c,n);
cout<<"做大装载量为"<<bestw<<endl;
}

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值