装载问题
有两艘船,载重量分别是c1、 c2,n个集装箱,重量是wi (i=1…n),且所有集装箱的总重量不超过c1+c2。确定是否有可能将所有集装箱全部装入两艘船。
采用回溯法一次从第一个货物到最后一个货物,最后行判断,哪一种最优
这里写代码片
public class Load {
/**
* @param args
*/
int c1=40,c2=50;
int[] Wi={7,8,9,12,13,16,5,7,8,7}; //货物重量
int[] a=new int[10]; //货物装载情况
int MaxValue=0; //最大价值
int Max=0;
public static void main(String[] args) {
// TODO Auto-generated method stub
Load Lo=new Load();
Lo.Search1(0);
Lo.PrintR();
}
public void ReadData(){
}
public void Search1(int m){ //第一艘船
if(m>=Wi.length){
CheckMax();
}else {
a[m]=0;
Search1(m+1);
a[m]=1;
Search1(m+1);
}
}
public void Search2(int m){ //第二艘船
if(m>=Wi.length){
CheckMax();
}else {
a[m]=0;
Search2(m+1);
a[m]=1;
Search2(m+1);
}
}
public void CheckMax(){ //判断是否达到最大值
int WC1=0;
int WC2=0;
for(int i=0;i<Wi.length;i++){
if(a[i]==0){
WC1=WC1+Wi[i];
}
}
for(int i=0;i<Wi.length;i++){
if(a[i]==1){
WC2=WC2+Wi[i];
}
MaxValue=WC1+WC2;
if(Max>MaxValue){
Max=Max;
}else{
Max=MaxValue;
}
if((WC1<=c1)&&(WC2<=c2)){
System.out.println("这种方案可以"+WC1+" "+WC2+a);
}
}
}
public void PrintR(){
System.out.println("最终的总装载重量是"+Max);
}
}