1.问题描述:有一批集装箱要装上一艘载重量为c的轮船,其中集装箱i的重量为wi。最优装载问题要求在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。
该问题可以形式化描述为:
式中xi=0表示不装入集装箱i,xi=1表示装入集装箱i。
2.问题分析:因为体积不受限制,每个集装箱除重量外都一样,所以为了装尽可能的集装箱,可以优先选择重量最轻的集装箱装入,依次类推。
3.贪心选择性质:每次选择重量最轻的集装箱装入,即每次选择局部最优的解,最终可以得到该问题的最优解。
4.最优子结构性质:设(y1,y2,…,yn)是所给0-1背包问题的一个最优解,则(y2,y3,…,yn)是如下子问题的一个最优解:
#include <iostream>
using namespace std;
void Loading(int x[],int w[],int c,int n)
{
//可以先对w进行排序
int weight=0;
for(int i=0;i<n;i++)
{
weight+=w[i];
if(weight<=c)x[i]=1;
else x[i]=0;
}
}
int main()
{
int w[]={1,2,3,4,5,6};
int x[6],c=10,n=6;
Loading(x,w,c,n);
for(int i=0;i<n;i++)
cout<<x[i]<<" ";
}
复杂度分析:主要体现在排序上