最优装载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最优装载
一、问题描述:
有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
二、输入:
表格一:物品的重量
三、输出:
图一:放入轮船的物品
四、算法描述:
定义存放的重量w[]、总容量为c、定义一个新数组数组内的序号定义为0,首先把数组的序号和数值打印出来,进行冒泡排序,把排序好的数组内的值打印一遍,开始往船上放物品,每放入一个物品,把这个物品的下标定义为1,并且用总容量c-w[i],当c大于0,就一直存放,直到不能放入为止。
五、算法设计:
使用贪心算法
首先要明白贪心算法,贪心算法以贪心为主,要达到每一步都是最优解。
于是,我先对物品的重量进行排序,在问题描述中已经得知,要将尽可能多的集装箱装上轮船,所以我按照从小到大的顺序物品排序完毕后,开始往轮船上放;在每一次放入后,刷新剩余的总容量,并将放入物品的下表定义为1,就这样依次装入,直到物品不能放入为止。
六、举例:
表格二:排序后的物品重量
因为轮船的容量为100,当第一个物品放入后当前背背包的容量为90,并且下标为1.
表格三:第一个物品放入后
当第一个物品放入后容量已经变为90,开始放入第二个物品,放入后当前总量为78,并让第二个物品下标为1。
表格四:第二个物品放入后
第二个物品放入后容量由原来的90变为现在的78,准备放入第三个物品,并让第三个下标为1。
表格五:第三个物品放入后
第三个物品放入后容量由原来的78变为现在的64,准备放入第四个物品,并让第四个下标为1。
表格六:第四个物品放入后
第四个物品放入后容量由原来的64变为现在的49,准备放入第五个物品,并让第五个下标为1。
表格七:第五个物品放入后
第五个物品放入后容量由原来的49变为现在的34,准备放入第六个物品,并让第六个下标为1。
表格八:第六个物品放入后
第六个物品放入后容量由原来的34变为现在的18,准备放入第七物品,并让第七个下标为1。
表格九:第七个物品放入后
第七个物品放入后容量由原来的18变为现在的2,准备放入第八个物品,发现第八个物品无法放入,循环结束。
七、附录:
#include
#include
#include
using namespace std;
void maopao(int b[],int t)
{
for (int i=t-1;i>0;i--)
{
for(int j=0;j
{
if(b[j]>b[j+1])
{
int temp=b[j];
b[j]=b[j+1];
b[j+1]=temp;
}
}
}
}
void printf1(int b[])
{
for(int i=0;i<5;i++)
{
cout< } cout< } void loading(int *a,int *r,int w,int n) { r[0]=1; w-=a[0]; for (int i=1;i { if(w-a[i]>=0) { w-=a[i]; r[i]=1; } } } void printf2(int *r,int len){ for (int i=0;i { cout< } printf("\n"); } int main() { int w[5]={5,6,7,8,9}; //w数组中存放重量,x数组存放要放入的物体的序号/* int w[20]; for(int i=1;i<=10;i++) { cin>>w[i]; }*/ int x[5]; int dinyi[5]={0}; int c=20; for(int j = 0;j<5;j++) { x[j]=j; cout< } cout< printf1(w); maopao(w,5); printf1(w); loading(w,dinyi,c,5); printf2(dinyi,5); return 0; }