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

来源:互联网 发布:拍卖东西的软件 编辑:程序博客网 时间:2024/04/28 19:21


   问题的提出:背包的容量为 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;
}

0 0
原创粉丝点击