最优装载问题或者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;
}
- 最优装载问题或者01背包问题的分支限界法求解
- 分支限界法:最优装载问题
- (C++)分支限界法求解背包问题
- 算法java实现--分支限界法--最优装载问题
- 分支限界---->装载问题
- 滑雪问题的分支限界法求解
- 装载问题的分支限界算法实现
- 装载问题之分支限界法
- 0034算法笔记——【分支限界法】最优装载问题
- 0034算法笔记——【分支限界法】最优装载问题
- 0034算法笔记——【分支限界法】最优装载问题
- 分支限界法(求最优装载)
- 分支限界法求解旅行商问题
- 0/1背包问题的分支限界
- 分支限界求解TSP问题
- 分支限界——01背包问题
- 分支限界法实现背包问题
- 0-1背包问题---分支限界法
- 安卓中的四种枚举类型 SharedPreferences 文件的访问权限
- 上传图片到七牛
- 两种类型的人, 不需要敏捷开发的实践
- 蓝桥杯 历届试题【高僧斗法】
- Win8 Metro(C#)数字图像处理--2.66FloodFill算法
- 最优装载问题或者01背包问题的分支限界法求解
- Java代码实现删除一个有序数组里面的重复元素
- JUnit最简单的测试案例
- Hexadecimal View HDU 4054 简短代码 详解
- union、union all、 Intersect、minus的用法讲解
- windows server 2008/windows server 2012 无线网络驱动无法安装解决
- SElinux 配置与管理
- shell脚本判断闰年的逻辑表达式
- UML应用表达业务逻辑