装载问题
有n个集装箱,需要装上两艘载重分别为c1和c2的轮船。wi为第i个集装箱的重量,且W1+W2+…+Wn≤c1+c2
问:是否存在一种合理的装载方案把这n个集装箱装上船?如果有,请给出一种方案。
算法步骤:
·先将重量排序(从大到小)
·判断最重物能否放入大船中,能放入则c=c1=最大物重量(90)=62
·判断第二重货物能否装入大船,80>62所以不行,考虑下一个货物,40<62所以可以放入,将剩余载货量c=62-40=20
·重复上述步骤,直到遍历完毕(但是我们发现到了20的时候会出现20<12+10所以我们需要记录最后每次走的值比较。)
·总而言之就是一条路走到底,走不通回来到前一个路口换一条路走,在走的路中记录最后走了多远,选最远那个。
package 装载问题;
public class 回溯法解决装载问题 {
static int n=7;
static int []w= {0,90,80,40,30,20,12,10};
static int c=152;
static int cw;
static int bestw;
static int r;
static int []x=new int[8];
static int []bestx=new int[8];
//-----------------------
public static int maxLoading(int []w,int c,int []bestx) {
int i=1;
int n=w.length-1;
int []x=new int[n+1];
int bestw=0;
int cw=0;
int r=0;
for (int j=1;j<=n;j++)
r+=w[j];
while(true)
{
while(i<=n&&cw+w[i]<=c)
{
r-=w[i];
cw+=w[i];
x[i]=1;
i++;
}
if(i>n)
{
for(int j=1;j<=n;j++)
bestx[j]=x[j];
bestw=cw;
}
else
{
r-=w[i];
x[i]=0;
i++;
}
while(cw+r<=bestw)
{
i--;
while(i>0&&x[i]==0)
{
r+=w[i];
i--;
}
if(i==0)
return bestw;
x[i]=0;
cw-=w[i];
i++;
}
}
}
public static void PrintIt() {
System.out.print("船1:");
for(int i=1;i<8;i++)
{
if(bestx[i]==1)
{
System.out.print(i+" ");
}
}
System.out.println();
System.out.print("船2:");
for(int i=1;i<8;i++)
{
if(bestx[i]==0)
{
System.out.print(i+" ");
}
}
}
public static void main(String[] args) {
maxLoading(w,c,bestx);
PrintIt();
}
}