最优装载

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档